我有一个包含至少30 000个dicts的json文件。它可以在这里找到:
http://openxcplatform.com.s3.amazonaws.com/traces/nyc/downtown-west.json
我已经在互联网上肆虐,发现这让我最接近我需要的东西,因为我需要逐个阅读json文件,将dicts作为一个实际的dict输入到列表中:
with open("test.json") as data_file:
for x in data_file:
json.dumps(it.append(ast.literal_eval(x)))
我测试了这段代码,它在大多数情况下都有效。我测试了前2000个元素,但是,一旦我测试了整个文件,我就收到了这个错误:
File "converter.py", line 58, in <module>
if __name__ == "__main__": main()
File "converter.py", line 34, in main
json.dumps(it.append(ast.literal_eval(x)))
File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/usr/lib/python2.7/ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "/usr/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
有人知道为什么会这样吗?
答案 0 :(得分:2)
首先,该文件不是JSON格式,而是JSON-lines。
其次,您不希望使用ast.literal_eval
读取JSON数据,因为它1)非常不安全,2)当它看到false
时,它不是JSON解析器并抛出错误true
。
使用json.loads。
答案 1 :(得分:1)
json.dumps
将dict转换为JSON。你正在反向 - 阅读JSON并转换为dict。您需要使用json.loads()
:
it = []
failures = []
with open('you_file.json') as f:
for line in f:
try:
it.append(json.loads(line))
except Exception:
failures.append(line)
print 'Parsed {0} lines'.format(len(it))
print 'Failed {0} lines'.format(len(failures))
答案 2 :(得分:0)
我发现使用TypeError: expected string or buffer in Google App Engine's Python有助于让程序正常运行。仅使用json.loads给了我一个类型错误。