np.savetxt 默认保存csv易出错,因默认科学计数法、无列名支持、不指定编码;需手动设fmt、delimiter、header及comments参数,遇中文或混合类型应改用pandas.to_csv。

savetxt 是最直接的办法,但默认行为容易把整数存成小数、丢掉列名、搞乱中文,得手动调几个关键参数才能用得安心。
为什么 np.savetxt 默认保存的 CSV 看起来“不对劲”
常见错误现象:数组是 [[1, 2], [3, 4]],保存后 CSV 里变成 1.000000000000000000e+00,2.000000000000000000e+00;或者整数全带小数点;又或者用 Excel 打开时中文列名乱码。
- 默认格式是
%.18e(科学计数法),数值精度高但可读性差 - 不支持写入列名(header)或行名(footer),得靠
header参数拼字符串,且仅限 str 类型 - 编码完全依赖系统默认(Windows 常是 gb2312),
np.savetxt本身不接受encoding参数
用 np.savetxt 保存整数/浮点数 CSV 的实操要点
核心是控制格式化和分隔符。如果数据纯数值、无标题,这是最快路径:
- 用
fmt指定格式:fmt='%d'存整数,fmt='%.2f'存两位小数,fmt='%s'强制转字符串(适合混类型) - 用
delimiter明确设为','(默认是空格,不是逗号) - 如果第一行想塞列名,先用
header='col_a,col_b',但注意:必须加comments='',否则默认会在 header 前加#
示例:
np.savetxt('data.csv', arr, delimiter=',', fmt='%.3f', header='x,y,z', comments='')
遇到中文、混合类型或需要可靠编码时,别硬刚 np.savetxt
它不接受 encoding,也没法自动处理 object 类型数组里的字符串。这时候强行用会出错或静默损坏数据。
- 报错
TypeError: Mismatch between array dtype ('object') and format specifier?说明数组含字符串,必须用fmt='%s' - 中文在 Excel 里显示为方块?因为文件实际是 utf-8,但 Excel Windows 版默认按 ANSI 解码 —— 此时与其折腾 BOM,不如换
pandas.DataFrame.to_csv - 只要有一列是字符串,整个数组 dtype 就是
object,np.savetxt对格式控制力大幅下降
什么时候该放弃 np.savetxt,改用 pandas
不是所有 NumPy 数组都适合用 np.savetxt 直出 CSV。当出现以下任一情况,切换更省事:
- 需要写入列名(尤其是含中文、空格、特殊符号的)
- 数组某列是字符串,且你不想手动
astype(str)再拼接 - 目标是 Excel 可靠打开(尤其 Windows 用户),需带 BOM 或指定 encoding
- 后续还要做清洗、筛选、合并 —— 那干脆从头用
pandas管理
简单过渡写法:
import pandas as pd<br>pd.DataFrame(arr).to_csv('data.csv', index=False, encoding='utf-8-sig')
真正麻烦的不是不会调 fmt,而是以为 np.savetxt 能像 Excel 那样“自动适配”,结果导出的文件在别人电脑上打不开、读不对、认不出列 —— 这些细节没显式声明,就等于没声明。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











