我正在尝试解码一个大的 utf-8 json 文件(2.2 GB)。我像这样加载文件:
f = codecs.open('output.json', encoding='utf-8')
data = f.read()
如果我尝试执行以下任何操作:json.load
,json.loads
或者json.JSONDecoder().raw_decode
我收到错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-40-fc2255017b19> in <module>()
----> 1 j = jd.decode(data)
/usr/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
367 end = _w(s, end).end()
368 if end != len(s):
--> 369 raise ValueError(errmsg("Extra data", s, end, len(s)))
370 return obj
371
ValueError: Extra data: line 1 column -2065998994 - line 1 column 2228968302
(char -2065998994 - 2228968302)
uname -m
节目x86_64
和
> python -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)`
所以我应该是 64 位的,整数大小应该不是问题。
但是,如果我运行:
jd = json.JSONDecoder()
len(data) # 2228968302
j = jd.raw_decode(data)
j[1] # 2228968302
返回的元组中的第二个值raw_decode
是字符串的结尾,因此raw_decode
似乎解析了整个文件,最后似乎没有垃圾。
那么,我应该对 json 做些什么不同的事情吗?实际上是在raw_decode
解码整个文件吗?为什么会json.load(s)
失败?