pandas.dataframe.to_excel()最省事,但嵌套列表需先转为等长二维结构,否则自动对齐填nan;长度不一时应补齐或用openpyxl逐行写入。

用 pandas.DataFrame.to_excel() 最省事,但要注意嵌套结构
直接传嵌套列表给 pd.DataFrame() 会出错或变形——比如 [[1,2], [3,4,5]] 会被截断或填充 NaN。必须先确保每行长度一致,或提前转成合法的二维结构。
实操建议:
- 若嵌套深度固定(如全是二维),用
pd.DataFrame(nested_list)即可,但需确认所有子列表长度相同,否则 pandas 会自动对齐并填NaN - 若子列表长度不一,先用
itertools.zip_longest()补齐,或手动 pad 成矩形结构再传入 - 避免用
numpy.array(nested_list)强转,容易触发VisibleDeprecationWarning或静默降级为object类型数组,写 Excel 时内容变成repr()字符串
用 openpyxl 手动写入更可控,适合复杂嵌套或大文件
openpyxl 不自动解析嵌套结构,得自己遍历。好处是能精确控制单元格位置、跳过空行、写入混合类型(如同时有 list 和 dict),也支持追加模式(append())。
常见错误现象:ws.append([ [1,2], [3,4] ]) 会把整个子列表当一个单元格内容(显示为字符串 "[1, 2]"),而不是展开成两列。
正确做法:
- 逐行遍历嵌套列表:
for row in nested_list: ws.append(row) - 若某行含字典或更深嵌套(如
[[{'a':1}], [2,3]]),需提前扁平化或序列化(例如用str()或json.dumps()) - 写入超万行时,禁用
ws.append()的样式继承(默认会复制上一行格式),改用ws.cell(row=r, column=c, value=v)避免内存暴涨
性能对比:小数据用 pandas,大数据或非规则结构用 openpyxl 直写
1000 行以内,pandas.to_excel() 简洁且自带格式兼容;但超过 5000 行,尤其含不等长子列表时,pandas 内部对齐逻辑反而拖慢速度,并可能吃掉双倍内存。
关键参数差异:
-
pandas.to_excel(engine='openpyxl')是默认,但底层仍构造完整 DataFrame,无法跳过中间结构 -
openpyxl.Workbook(write_only=True)可显著降低内存占用(适合 >10 万行),但只能顺序写、不能改已写单元格 - 不要混用:在同一个
.xlsx文件上先用pandas写,再用openpyxl加 sheet——容易因引擎冲突报BadZipFile
遇到 ValueError: Expected a string or number 怎么办
这是 openpyxl 最常报的错,本质是往单元格塞了它不认识的类型,比如 list、dict、None(虽然 None 实际会被转为空单元格,但某些版本会卡住)。
排查和修复步骤:
- 用
isinstance(v, (list, dict, tuple))检查嵌套列表中每个元素,发现就提前处理 - 简单方案:统一
str(v),但注意中文编码无问题,str([1,2])得到"[1, 2]",符合多数人预期 - 结构化需求强的场景,用
json.dumps(v, ensure_ascii=False)保留原始结构,Excel 中可读性更好 - 别忽略
datetime和Decimal——openpyxl支持,但 pandas 可能转成 float,导致精度丢失
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











