我正在尝试将非常大的json文件转换为csv。我已经能够将这种类型的小文件转换为10个记录(例如)csv文件。但是,当尝试转换大文件(在csv文件中大约50000行)时,它不起作用。数据由curl命令创建,-o指向要创建的json文件。输出的文件中没有换行符。 csv文件将使用csv.DictWriter()和(其中数据是json文件输入)具有表单
rowcount = len(data['MainKey'])
colcount = len(data['MainKey'][0]['Fields'])
然后循环遍历行和列的范围以获取csv字典条目
csvkey = data['MainKey'][recno]['Fields'][colno]['name']
cvsval = data['MainKey'][recno][['Fields'][colno]['Values']['value']
我尝试使用其他问题的答案,但它们不适用于大文件(du -m bigfile.json = 157
),我想要处理的文件更大。
尝试获取每行的大小显示
myfile = open('file.json','r').
line = readline():
print len(line)
表明这会将整个文件作为完整字符串读取。因此,一个小文件将显示长度为67744,而较大的文件将显示为163815116.
尝试直接从
读取数据data=json.load(infile)
给出了其他问题已针对大文件讨论的错误
尝试使用
def json_parse(self, fileobj, decoder=JSONDecoder(), buffersize=2048):
yield results
如another answer所示,与72 kb文件(10行,22列)一起工作,但似乎锁定或花费无限的时间用于157 MB的中间大小文件(来自du - m bigfile.json)
请注意,调试打印显示每个块的大小为2048,由默认输入参数指定。它似乎试图通过2048块的整个163815116(从上面的len显示)。如果我将块大小更改为32768,那么简单的数学运算表明在循环中需要5,000个循环来处理文件。
对块大小524288的更改大约每11个块退出循环,但仍应使用大约312个块来处理整个文件
如果我可以在每个行项目的末尾停止它,我将能够处理该行并根据下面显示的表单将其发送到csv文件。
小文件上的vi显示它的格式为
{"MainKey":[{"Fields":[{"Value": {'value':val}, 'name':'valname'}, {'Value': {'value':val}, 'name':'valname'}}], (other keys)},{'Fields' ... }] (other keys on MainKey level) }
我不能使用ijson,因为我必须为那些无法导入其他软件的系统设置它。
答案 0 :(得分:1)
我使用块大小为8388608(0x800000十六进制)来处理文件。然后,我处理了作为循环的一部分读入的行,保持处理的行数和丢弃的行。在每个流程函数中,我将数字添加到总计中,以便我可以跟踪处理的总记录。
这似乎是它需要的方式。
下次提出这样的问题时,请强调必须指定大块大小而不是原始答案中显示的2048.
循环
first = True
for data in self.json_parse(inf):
records = len(data['MainKey'])
columns = len(data['MainKey'][0]['Fields'])
if first:
# Initialize output as DictWriter
ofile, outf, fields = self.init_csv(csvname, data, records, columns)
first = False
reccount, errcount = self.parse_records(outf, data, fields, records)
在解析例程中
for rec in range(records):
currec = data['MainKey'][rec]
# If each column count can be different
columns = len(currec['Fields'])
retval, valrec = self.build_csv_row(currec, columns, fields)
要解析列,请使用
for col in columns:
dataname = currec['Fields'][col]['name']
dataval = currec['Fields'][col]['Values']['value']
因此,引用现在可以正常工作并正确处理。大块显然允许处理足够快以处理数据,同时小到足以使系统不会过载。