Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 2.6.6中打开一个大型JSON文件,无需换行符即可进行csv转换_Python_Json_Csv - Fatal编程技术网

在Python 2.6.6中打开一个大型JSON文件,无需换行符即可进行csv转换

在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

我正在尝试将一个非常大的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
如中所示,它可以处理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行,但如果可能的话,我仍然希望找到一种更有效的处理方法。