在Python 2.6.6中打开一个大型JSON文件,无需换行符即可进行csv转换
我正在尝试将一个非常大的json文件转换为csv。我已经能够将这种类型的小文件转换为10记录(例如)csv文件。但是,当尝试转换一个大文件(csv文件中大约50000行)时,它不起作用。数据由curl命令创建,其中-o指向要创建的json文件。输出的文件中没有换行符。csv文件将使用csv.DictWriter()编写,其中数据为json文件输入,格式为在Python 2.6.6中打开一个大型JSON文件,无需换行符即可进行csv转换,python,json,csv,Python,Json,Csv,我正在尝试将一个非常大的json文件转换为csv。我已经能够将这种类型的小文件转换为10记录(例如)csv文件。但是,当尝试转换一个大文件(csv文件中大约50000行)时,它不起作用。数据由curl命令创建,其中-o指向要创建的json文件。输出的文件中没有换行符。csv文件将使用csv.DictWriter()编写,其中数据为json文件输入,格式为 rowcount = len(data['MainKey']) colcount = len(data['MainKey'][0]['Fiel
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
如中所示,它可以处理72KB的文件(10行22列),但对于157MB的中等大小的文件(来自du-mbigfile.json),它似乎要么会被锁定,要么会花费无穷无尽的时间
请注意,调试打印显示每个块的大小为2048,由默认输入参数指定。似乎它正试图在2048个块中遍历整个163815116(如上面的len所示)。如果我将块大小更改为32768,简单的数学计算表明,处理文件需要5000个循环
对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,因为我必须为无法为其导入其他软件的系统设置它。我使用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']
因此,引用现在可以正常工作,并且处理正确。较大的数据块显然允许处理速度足够快,以处理数据,同时又足够小,以避免系统过载。
open('file.json','r').readline()
返回一行,然后for
循环迭代该行的各个字符。@MartijnPieters说的!如果不访问您的bigfile.json
,我们就不可能知道为什么我之前的答案不适用于您。文件中单独的、不同的JSON条目有多大?也许您应该在my函数中添加一个print
语句,以显示缓冲区有多大?在buffer+=chunk
之后添加一个print('buffer size now',len(buffer))
以查看文件“挂起”时读取了多少。感谢您指出chunk size问题。python似乎能够使用8388606的块大小一次处理1000行,但如果可能的话,我仍然希望找到一种更有效的处理方法。