Ubuntu下Pandas1.4.3如何读取records格式的JSON DataFrame?
问题
在Ubuntu系统中使用Python 3.8及Pandas 1.4.3版本,将机器学习训练用的DataFrame以orient='records'格式导出为JSON文件时,设置了lines=True和indent=4参数提升可读性,但使用pd.read_json(path_or_buf=filename, orient='records')读取时报错。
示例代码:
filename='train_data.json' train_data.to_json(path_or_buf=filename, orient='records', lines=True, indent=4) pd.read_json(path_or_buf=filename, orient='records') # 执行报错
需求:
- 如何读取得到与原DataFrame完全一致的结果(不含索引、无额外无名列);
- 能否实现读写解耦,让读取方法不依赖导出时的
lines和indent参数(生产环境读写可能在不同进程)。
解决方案
需求1:正确读取导出的JSON文件
导出时启用了lines=True,生成的是每行一个JSON对象的JSON Lines格式,但读取时未对应设置该参数,导致解析失败。只需在读取时加上lines=True即可:
pd.read_json(path_or_buf=filename, orient='records', lines=True)
执行后就能得到和原DataFrame完全一致的结果,不会包含原索引或额外无名列。
需求2:实现读写解耦
要让读写逻辑不依赖导出时的lines和indent参数,需要约定统一的标准格式,以下两种方案均可:
方案1:使用标准JSON数组格式
导出时不设置lines=True,生成标准的JSON数组格式,indent=4仅用于提升可读性,不影响读取逻辑:
# 导出代码 train_data.to_json(path_or_buf=filename, orient='records', indent=4) # 读取代码(无需关心indent参数) pd.read_json(path_or_buf=filename, orient='records')
这种格式是通用的JSON结构,只要双方约定orient='records',读取时无需额外参数,完全解耦indent和lines。
方案2:固定使用JSON Lines格式
如果因数据量等原因必须用JSON Lines格式,可约定读写都启用lines=True,此时导出时的indent=4不会影响读取(Pandas解析时会自动忽略缩进):
# 导出代码 train_data.to_json(path_or_buf=filename, orient='records', lines=True, indent=4) # 读取代码(只需约定orient和lines参数) pd.read_json(path_or_buf=filename, orient='records', lines=True)
只要双方预先约定好orient='records'和lines=True,不管导出时是否设置indent,读取都能正常工作,实现解耦。
内容的提问来源于stack exchange,提问作者Della
相关产品推荐
相关产品推荐

