Python使用json.load/loads加载JSON文件报错求助
嘿,我来帮你搞定这两个JSON加载的问题!先逐个分析你的错误,再给出可行的解决方案。
第一个错误:ValueError: Extra data
你用这段代码时出现了这个错误:
import json with open('photos.json') as f: data = json.load(f)
原因
你的JSON文件是JSON Lines格式——也就是每行一个独立的JSON对象,但它不是标准的JSON数组(没有用[]包裹所有对象,也没有用逗号分隔它们)。json.load()要求整个文件是一个单一的合法JSON结构(比如一个数组或一个单独的对象),当它解析完第一个对象后,发现后面还有额外的内容,就会抛出这个错误。
看你提供的样本,确实是每行一个独立的{...}对象,没有被数组包裹,这就是问题所在。
第二个错误:TypeError: expected string or buffer
你用这段代码时出现了这个错误:
import json with open('photos.json') as f: data = json.loads(f)
原因
json.loads()的参数必须是字符串、字节或字节数组,但你直接传入了文件对象f,它根本不是字符串类型,所以触发了类型错误。正确的用法是要么用json.load(f)(它会自动读取文件内容并解析),要么先把文件内容读成字符串再传给json.loads(),比如json.loads(f.read())——不过后者对于你的大文件来说,不仅会占用大量内存,还会回到第一个错误的问题。
最佳解决方案:逐行解析JSON Lines文件
既然你的文件是JSON Lines格式,而且看起来非常大(到20多万行),最高效的方式就是逐行读取并解析每个对象,这样既不会占用太多内存,也能避免上述两个错误。
用这段代码试试:
import json data = [] with open('photos.json', 'r') as f: for line in f: # 跳过可能存在的空行 stripped_line = line.strip() if stripped_line: data.append(json.loads(stripped_line))
代码说明
- 我们逐行读取文件,每次只处理一行内容
- 用
strip()去掉每行的换行符和空白,跳过空行(避免解析空字符串报错) - 用
json.loads()解析每行的单个JSON对象,然后添加到列表data中
如果你的文件特别大,不想把所有数据都存在内存里,也可以在循环里直接处理每个对象(比如写入数据库、做数据分析),而不是都存在data列表里。
备选方案:修改文件为标准JSON数组
如果你能修改原始文件,可以把它改成合法的JSON数组:
- 在文件开头添加
[ - 在每个对象的末尾(除了最后一个)添加逗号
- 在文件末尾添加
]
不过对于20多万行的文件来说,手动修改肯定不现实,你可以写个脚本批量处理,但逐行解析的方案显然更省心。
内容的提问来源于stack exchange,提问作者Aakash aggarwal

