numpy数组不能直接写入excel,需导出为csv;关键在用delimiter=','、encoding='utf-8-sig'及np.nan_to_num处理特殊值,或优先转pd.dataframe导出以保障列名、编码与空值兼容性。

NumPy数组本身不能直接写入Excel文件(.xlsx),但导出为CSV(.csv)后,Excel可以正常打开并保留数值结构——关键在于编码、分隔符和缺失值处理,否则容易出现乱码、列错位或空值显示异常。
用 np.savetxt() 控制分隔符与编码
默认的 np.savetxt() 会用空格分隔,Excel打不开;必须显式指定 delimiter=','。Windows版Excel默认读取 utf-8-sig 编码(带BOM),直接写 utf-8 可能导致中文乱码。
实操建议:
- 用
np.savetxt()写入时加delimiter=','和fmt='%.6g'避免科学计数法干扰阅读 - 不直接用
encoding参数(np.savetxt()不支持),改用open()手动控制编码:
with open('data.csv', 'w', encoding='utf-8-sig') as f:
np.savetxt(f, arr, delimiter=',', fmt='%.6g')
注意:若 arr 是二维,np.savetxt() 默认逐行写入,符合CSV格式;若是一维,会写成单行,需用 arr.reshape(-1, 1) 强制转列向量。
处理 NaN 和 inf 值
Excel不识别 nan 或 inf 字面量,直接写入会导致单元格显示为 #VALUE! 或被跳过。NumPy默认输出 nan 为 nan 字符串,但Excel不认这个文本。
常见错误现象:CSV里看到 nan,但在Excel中该单元格为空或报错。
实操建议:
- 用
np.nan_to_num(arr, nan='', posinf='', neginf='')将特殊值替换为空字符串(适合文本型CSV) - 或更稳妥地用
pd.DataFrame(arr).to_csv()(见下一条),它默认把nan转成空字段,Excel原生兼容
为什么推荐先转 pd.DataFrame 再导出
np.savetxt() 简单但功能有限:不支持列名、无法自动处理混合类型、对 object 数组(如含字符串)易出错。而 pd.DataFrame 是专为表格数据设计的中间层,导出CSV时默认行为更贴近Excel预期。
实操建议:
- 即使只用NumPy,也值得临时转一次:
pd.DataFrame(arr).to_csv('data.csv', index=False, encoding='utf-8-sig') - 如果原始数组含字符串或需要列标题,必须走这一步;
index=False防止多出一列行号 - 性能影响极小——对百万级以下数据,转换+导出耗时差异可忽略
真正容易被忽略的是编码细节:Mac/Linux版Excel读 utf-8 没问题,但Windows用户几乎必踩 utf-8-sig 的坑;还有就是一维数组默认导出为单行,不是单列,这点和Excel“一列数据”的直觉相反。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











