Python中json.loads导入数据是否存在大小限制?355MB文件加载报错
解决大JSON文件导入Python时的报错问题
嘿,我来帮你搞定这个导入大JSON的麻烦!你用json.loads(open('Myfile.json').read())的方式处理355MB的文件,很容易触发内存不足的问题,而且报错信息没显示全,也有可能是JSON本身存在格式错误。下面给你几个实用的解决方案:
1. 改用流式解析,避免一次性加载整个文件
直接把超大文件读成字符串会占满内存,咱们换个思路,逐段解析JSON,不用一次性加载全部内容。用Python标准库的json.JSONDecoder.raw_decode()就能实现:
import json def stream_large_json(file_path): decoder = json.JSONDecoder() with open(file_path, 'r') as f: buffer = '' for line in f: buffer += line.strip() try: # 尝试解析当前缓存的内容 result, parse_end = decoder.raw_decode(buffer) yield result # 把已经解析过的部分从缓存里去掉 buffer = buffer[parse_end:] except ValueError: # 缓存内容不够完整,继续读下一行 continue # 把解析结果转成列表(如果是单个大对象,这个方法也能逐步加载) CATALOG = list(stream_large_json('Myfile.json'))
这个方法的内存占用会低很多,适合处理几百MB级别的JSON文件。
2. 先检查JSON格式是否正确
你的报错信息截断了,很可能是JSON文件本身有格式问题,比如引号不匹配、逗号缺失或者括号没闭合。可以先读取一小部分内容测试:
import json with open('Myfile.json', 'r') as f: # 先读取前10KB内容测试格式 test_content = f.read(10000) try: json.loads(test_content) print("前10KB的JSON格式没问题哦") except ValueError as e: print(f"发现格式错误:{e},错误位置大概在第{e.args[1]}位")
如果小范围测试没问题,再看是不是整个文件的末尾有格式问题。
3. 用更高效的内存读取方式
哪怕你还是想一次性加载,也别用open().read()再转json.loads(),直接用json.load()从文件对象读取,它的内存效率更高:
import json with open('Myfile.json', 'r') as f: CATALOG = json.load(f)
不过这个方法对于355MB的文件,还是有可能出现内存不足的情况,优先推荐流式解析的方案。
如果你的JSON是一个包含大量独立对象的数组,也可以试试第三方库ijson,它专门用来流式解析大JSON,安装后用起来很方便,不过如果不想额外装库,上面的标准库方法完全够用啦。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

