pd.read_json()读取失败主因是JSON结构不匹配:默认仅支持records/split等格式,遇单对象或嵌套结构需先用json.load()解析并显式提取子键(如raw["items"])再转DataFrame。

read_json读取JSON失败:常见格式问题与修复方法
直接用 pd.read_json() 读取 JSON 文件经常报错,核心原因不是函数不行,而是 JSON 结构不匹配。pandas 默认只接受“records”或“split”等明确格式的 JSON,而日常拿到的 JSON 往往是嵌套字典、列表套字典,或单层对象。
- 如果 JSON 是一个对象(
{"name": "Alice", "age": 30}),read_json()会报ValueError: Invalid file path or buffer object—— 它期待的是数组(即多条记录) - 如果 JSON 是嵌套结构(如
{"data": [{"id": 1}, {"id": 2}]}),必须先提取data字段,再传给read_json(),否则生成的 DataFrame 列名会是"data"这个字符串,内容却是整个列表 - 推荐做法:先用内置
json.load()解析,再手动选子结构。例如:import json<br>import pandas as pd<br><br>with open("data.json") as f:<br> raw = json.load(f)<br>df = pd.DataFrame(raw["items"]) # 显式提取键
to_excel写入Excel时中文乱码或样式丢失
to_excel() 本身不处理编码(Excel 是二进制格式),所谓“乱码”其实是 Excel 应用程序打开时默认用了错误字体或未启用 UTF-8 兼容模式;样式丢失则是因为该方法默认不写入任何格式,纯数据导出。
- 中文显示异常?不用改参数,只需确保用 Excel 2016+ 打开,或用 WPS/Numbers 等现代工具——老版本 Excel 对 UTF-8 BOM 不敏感,但 pandas 写出的文件本就不带 BOM,强行加反而可能出错
- 想控制列宽、冻结首行、加粗标题?
to_excel()不支持。必须用openpyxl或xlsxwriter引擎配合ExcelWriter手动操作,例如:with pd.ExcelWriter("out.xlsx", engine="openpyxl") as writer:<br> df.to_excel(writer, index=False)<br> workbook = writer.book<br> worksheet = writer.sheets["Sheet1"]<br> worksheet.column_dimensions["A"].width = 20 - 注意:若使用
engine="xlsxwriter",不支持追加写(mode="a");而openpyxl支持,但初始化时需确认文件存在且非打开状态
处理含列表/字典字段的JSON:避免to_excel崩溃
pandas 允许 DataFrame 某列是 list 或 dict 类型,但 to_excel() 遇到这种单元格会直接报 TypeError: Unsupported type —— 它只认基本 Python 类型(str/int/float/bool/None)和 numpy/pandas 原生类型。
清理、标准化、验证并汇总杂乱的 Excel 工作簿。当 Codex 需要处理 `.xlsx`、`.xls`、`.xlsm` 或 `.csv` 格式的数据时使用,包括:统一表头格式、删除空白行与空白列、修剪文本内容、去重记录、检测数据质量问题、拆分或合并工作表、生成清洗后的工作簿,以及为业务电子表格生成审计摘要。
- 快速修复:对含复杂类型的列做预处理,比如转成 JSON 字符串:
df["tags"] = df["tags"].apply(lambda x: json.dumps(x, ensure_ascii=False) if isinstance(x, (list, dict)) else x)
- 更稳妥的方式是展开嵌套结构。例如某列值为
[{"k": "v1"}, {"k": "v2"}],可用pd.json_normalize()拆解后 join 回原表,而不是留在一列里 - 别依赖
orient="values"或orient="table"来绕过——这些参数只影响read_json()的解析逻辑,对to_excel()无作用
大JSON文件(>100MB)内存爆掉怎么办
一次性 json.load() + pd.DataFrame() 会把全部数据载入内存,尤其当 JSON 是巨型数组时极易 OOM。pandas 本身不支持 JSON 流式读取,必须换思路。
- 用
ijson库边读边 yield 字典,分批构造小 DataFrame,再用pd.concat(..., ignore_index=True)合并(注意设copy=False减少副本) - 更高效的做法是跳过 pandas 中间层:用
csv.DictWriter直接写 CSV,再用 Excel 打开(CSV 对中文、大文件更友好,且无内存压力) - 如果坚持输出 .xlsx,可用
openpyxl的append()方法逐行写入,避免构建完整 DataFrame —— 但要自己处理表头、类型转换、空值映射等细节
实际项目中,真正卡住人的往往不是 API 调用是否正确,而是 JSON 数据源的隐式结构假设和 Excel 生态的兼容性边界。多花两分钟看一眼原始 JSON 的顶层 keys 和 sample value 类型,比反复调参快得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










