在Python中打开一个大型JSON文件,没有csv转换Python 2.6.6的换行符

时间:2014-02-12 14:51:10

标签: 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]['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,因为我必须为那些无法导入其他软件的系统设置它。

1 个答案:

答案 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']

因此,引用现在可以正常工作并正确处理。大块显然允许处理足够快以处理数据,同时小到足以使系统不会过载。