
本文介绍如何正确处理以json lines格式存储的超大文件(如3gb的多行独立json),避免使用ijson导致的“trailing garbage”错误,并提供简洁、内存友好的标准库解决方案。
本文介绍如何正确处理以json lines格式存储的超大文件(如3gb的多行独立json),避免使用ijson导致的“trailing garbage”错误,并提供简洁、内存友好的标准库解决方案。
你遇到的错误并非代码或ijson用法问题,而是根本性格式误解:你下载的Kaggle数据集(美国职位招聘信息)不是单个JSON文档,而是一个典型的 JSON Lines(NDJSON) 文件——即每行一个独立、合法的JSON对象,彼此之间用换行符分隔。这种格式不满足JSON语法规范(完整JSON必须有且仅有一个顶层对象或数组),因此ijson按'item'路径解析时会将第二行视为“尾部垃圾”(trailing garbage),报错终止。
✅ 正确做法是放弃ijson,改用Python内置json模块逐行解析:
import json
with open('file.json', 'r', encoding='utf-8') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line: # 跳过空行
continue
try:
obj = json.loads(line)
# ✅ 此处处理每个职位对象,例如:
# print(obj.get('_id', {}).get('$oid', 'N/A'))
except json.JSONDecodeError as e:
print(f"第 {line_num} 行解析失败: {e} | 内容: {line[:100]}...")
⚠️ 注意事项:
- 务必使用文本模式('r')而非二进制模式('rb'):json.loads() 接收字符串,open(..., 'rb') 返回字节流需额外解码,易出错;
- 添加 strip() 和空行检查:防止因Windows换行符或意外空白导致解析失败;
- 包裹 try-except:大型数据集常含少量格式异常行,健壮性必备;
- 编码显式声明:Kaggle数据通常为UTF-8,明确指定 encoding='utf-8' 避免乱码;
- 无需第三方库:标准库json + 行迭代已完全满足流式处理需求,内存占用恒定(约几KB),可轻松处理3GB+文件。
? 小结:当面对以换行分隔的多个JSON对象(JSON Lines / NDJSON)时,ijson 并非合适工具——它专为解析单个巨型JSON文档中的嵌套结构而设计(如{"data": [{"a":1}, {"b":2}]})。而你的场景本质是“批量读取小JSON”,最简、最稳、最省内存的方式就是逐行json.loads()。此方法已在生产环境稳定处理TB级日志与爬虫数据,是JSON Lines事实上的标准实践。










