python - 在python中加载1GB大json文件时如何解决内存错误?

标签 python csv io out-of-memory

我正在尝试将 json 文件转换为 csv 但出现内存错误。 是否有任何有效的方法来微调此代码以在 python 中处理大型 json 文件。

def change(row, pastkeys=()):
result = {}
c=0
for key in row:
    c=c+1
    newkey = pastkeys + (key,)
    print key
    val = row[key]
    if isinstance(val, dict):
        result.update(change(val, newkey))
    elif isinstance(val, list):
        result.update(change(dict(zip(range(0, len(val)), val)), newkey))
    else:
        result[newkey] = val
return result
a=open(sys.argv[1],'r')
lines=list(a)
 print lines
out1=open(sys.argv[2],'w')
try:
  data = json.loads(''.join(lines))
  if isinstance(data, dict):
    data = [data]
  except ValueError:
    data = [json.loads(line) for line in lines]
 result = []
 fields = set()
 for row in data:
    hash = change(row)
    fields |= set(hash.keys()
    result.append(hash)
out1=open(sys.argv[2],'w+')
fields = sorted(fields)
out = csv.writer(out1,lineterminator='\n')
out.writerow(['-'.join([str(f) for f in field]) for field in fields])
for row in result:
out.writerow([(row.get(field,'')) for field  in fields ])

a.close()

最佳答案

您可以尝试使用 ijson .它是一个将 JSON 作为流而不是 block 文件使用的模块。 ijson JSON 之于 XML 就像 SAX 之于 XML。

import ijson
for prefix, theType, value in ijson.parse(open(jsonFileName)):
    print prefix, theType, value

关于python - 在python中加载1GB大json文件时如何解决内存错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37028836/

相关文章:

file - 如何将一系列命令的输出重定向到 stdout 和 Tcl 中的文件?

python - 无法跟踪 Scrapy 中的链接

python - Python 原生模块中的 sanitizer

python - 从 MySQL 语句获取结果并存储在 Python 列表中并检查条件

c++ - 如何使用 C/C++ 有效地加入巨大的 csv 文件(100 0's of columns x 1000' 行)?

c - 从 C 程序中使用 $EDITOR 变量打开文件进行编辑

python - 在 Pandas 上绘制整行

javascript - 创建 CSV 并使用 JS 打开,在 IE、Chrome 中不起作用

ios - 在Objective-C中将RTF文件转换为TXT/CSV文件?

java - Java I/O 缓冲区链接和装饰原理