当前位置: 首页 > 知识库问答 >
问题:

如何在Python中一次一个字典地将数据转储到json文件中?

司马高韵
2023-03-14

目前,我的网络爬虫正在收集所有数据,并将它们全部放入字典中,例如:

def save_data_to_json(data, json_file_name):
    print 'Saving data into json file...'
    with open(json_file_name, 'a') as outfile:
        json.dump(data, outfile, sort_keys = True, indent = 4, ensure_ascii = False)

def gather_data(page_url, soup, all_data):
    #return if this page doesn't contain data
    if (soup.find('h4') == None) or (soup.find('span') == None):
        return
    company_name = soup.h4.span.text
    table_body = soup.tbody
    table_rows = table_body.find_all('tr')
    company_data = {}

    for tr in table_rows:
        td = tr.find_all('td')
        row = [str(i.text) for i in td]
        if len(row) != 2:
            continue
        company_data[row[0]] = row[1]
        all_data[str(company_name)] = company_data
    #I want to save data here, but saving now instead of later messed up json formatting
    #save_data_to_json(all_data, json_file_name)

在这样做的时候,我必须从每个链接读取所有的数据,并将它们转储到这个数据字典中。是否有一种方法可以将每个页面的每个数据集写入一个json格式的文件(一次一个字典集),以节省内存?由于多出的花括号,尝试将json格式弄得一团糟。我只想一起输出一个json文件。

共有3个答案

祖波光
2023-03-14

首先,如果您希望节省一些内存,而不是使用bulks,那么限制每个bulk包含的实体数量,当它达到这个限制时,将其保存到Json(我将展示示例)。

接下来,您可以将多个字典保存到单个Json中,只需为每个字典转到不同的行。

def gather_data(page_url, soup, all_data, file_path):
    #return if this page doesn't contain data
    max_per_bulk_ = 10000
    if (soup.find('h4') == None) or (soup.find('span') == None):
        return
    company_name = soup.h4.span.text
    table_body = soup.tbody
    table_rows = table_body.find_all('tr')
    company_data = {}
    f = open(file_path, 'a')
    bulk_ = []
    for tr in table_rows:
        td = tr.find_all('td')
        row = [str(i.text) for i in td]
        if len(row) != 2:
            continue
        company_data[row[0]] = row[1]
        all_data[str(company_name)] = company_data
        if len(bulk_) > max_per_bulk_:
            with open(file_path, 'a') as f:
                for entity in bulk_:
                    j = json.dump(entity)
                    f.write(j)
                    f.write('\n')
                bulk_ = []

    if bulk_:
        with open(file_path, 'a') as f:
            for entity in bulk_:
                j = json.dump(entity)
                f.write(j)
                f.write('\n')
卢元龙
2023-03-14

我同意Barmar的观点,当您将JSON内容放入文件时,您必须做出不同的安排。比如传递一些特殊的文本识别,您可以从中找到JSON的结尾

闾丘树
2023-03-14

考虑使用jsonlines,它是json的一个变体,更适合于“流式”读或写。基本上,每一行都应该是一个有效的json文档。

基本的python json库通常就足够了(您读取一行文本,然后解析这一行),或者您可以使用helper库,例如:https://jsonlines.readthedocs.io/en/latest/

 类似资料:
  • 我想将废弃的数据转储到json文件中。我相信它的格式已经很好了(dictionary、list、string等)。我如何输出到json文件中?

  • 我想将字典转储到文件,就像将Python字典转储到JSON文件一样。但是我面临着编码的问题:当我简单地做 我在终端中得到类似这样的东西: 所以它是正常的、人类可读的文本。但是当我以这种方式将同一个字典转储到某个json文件时: 文件中有奇怪的混乱的特殊字符: 我尝试像这里一样指定ensure_ascii=False:Python将JSON文件保存为UTF-8,但它会抛出UnicodeEncodeE

  • 我有两本字典Dict1和DICT2。Dict1中每个键的值如下所示: 但是Dict2由键组成,这些键是DICT1中的值。DICT2中的值是由元组组成的列表,如下所示。 我得到的当前输出是 我想要的输出应该是字典式的:

  • 问题内容: 我想一次从文件中读取一个数字列表作为一个字符,一次检查一个字符,以检查该字符是什么,是否是数字,句点,+或-,e或E或其他一些字符。 ..然后基于此执行我想要的任何操作。如何使用已有的现有代码执行此操作?这是我尝试过的示例,但是没有用。我是python的新手。提前致谢! 问题答案: 从文件中读取行。以文本块的形式读取整个文件,然后遍历文本的每个字符:

  • 我有一个这样的口述: 我不知道如何将dict转储到JSON文件中,如下所示: 有没有一种pythonic的方法来实现这一点? 您可能会猜测我想生成一个树映射。

  • 问题内容: Swift中的数组支持+ =运算符,可将一个数组的内容添加到另一个数组。有没有简单的方法可以做到这一点的字典? 例如: 问题答案: 您可以为定义运算符,例如