Python如何处理超大JSON文件?Object365数据集5.5MB标注文件读取问题咨询
Python处理JSON文件的常见问题和解决方案
5.5MB的JSON对于Python来说属于极小体积的文件,完全不需要特殊的大文件处理逻辑,加载失败是代码逻辑或配置错误导致,常见原因如下:
- 路径配置错误:
inputJsonFile参数传入的路径不存在、拼写错误,Windows系统下路径未加r前缀导致转义字符识别异常,程序在路径校验阶段就抛出异常,没有执行到后续打印逻辑 - 第一个代码的
readFileLine函数逻辑错误:f.readline()仅会读取文件的第一行内容,如果你拿到的Object365标注JSON是格式化后的多行存储结构,仅读取第一行根本无法拿到完整的JSON结构,会直接解析失败 - 输出缓冲问题:Python的print函数默认是行缓冲,如果输出内容没有换行或者程序提前崩溃,打印内容可能留在缓冲里没有输出到控制台,给print加
flush=True参数可以强制刷新输出
5.5MB小体积JSON的正确加载代码
import json from pathlib import Path def ob365_converter(inputJsonFile, datasetPath): input_path = Path(inputJsonFile) # 路径校验不通过直接抛出明确错误 if not input_path.is_file(): raise FileNotFoundError(f"标注文件不存在,绝对路径为:{input_path.absolute()}") print("开始加载JSON文件", flush=True) with open(input_path, "r", encoding="utf-8") as f: dataset_json = json.load(f) print("JSON加载完成,共包含{}条标注".format(len(dataset_json["annotations"])), flush=True) for item in dataset_json["annotations"]: # 你的标注处理逻辑 pass
如果运行时报编码错误,给open函数添加errors="ignore"参数即可。
超大JSON文件(>1GB,无法一次性加载进内存)的处理方案
如果你后续遇到更大体积的JSON文件,不需要一次性加载全量内容,可以用流式解析库ijson逐元素读取,内存占用仅和单条数据的大小有关:
- 安装依赖:
pip install ijson - 示例代码:
import ijson def stream_load_ob365(inputJsonFile): with open(inputJsonFile, "r", encoding="utf-8") as f: # 流式迭代读取annotations数组下的所有元素 for annotation in ijson.items(f, "annotations.item"): # 直接处理单条标注 pass
内容的提问来源于stack exchange,提问作者Francesco Pagani
相关产品推荐
相关产品推荐

