从多个dicts

时间:2016-02-25 22:34:17

标签: python json string dictionary malformed

我有一个包含至少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

有人知道为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

首先,该文件不是JSON格式,而是JSON-lines

其次,您不希望使用ast.literal_eval读取JSON数据,因为它1)非常不安全,2)当它看到false时,它不是JSON解析器并抛出错误true

使用json.loads

答案 1 :(得分:1)

你没有&#39;想要使用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给了我一个类型错误。