csv.writer最轻量但需手动处理newline和utf-8-sig编码,pandas.to_csv省心但有类型转换、索引、转义等隐式行为;二者均要求行长度一致,大数据量优先csv.writer。

用 csv.writer 写二维列表最轻量,但得手动处理换行和编码
直接写入二维列表时,csv.writer 是零依赖方案,适合简单导出。它把每行当作一个可迭代对象,逐行写入,不自动加换行符(Windows 下需指定 newline=''),也不处理中文乱码(得显式设 encoding='utf-8-sig')。
常见错误是忽略 newline='',导致 Excel 打开时多出空行;或用默认编码写中文,在 Windows 上显示为乱码。
- 必须传
open(..., newline=''),否则在 Windows 下每行后多一个空行 - 写中文务必用
encoding='utf-8-sig'(不是utf-8),否则 Excel 打不开或乱码 -
writer.writerows(data)直接写整个二维列表,比循环调用writerow()更快
import csv
data = [['姓名', '年龄'], ['张三', 25], ['李四', 30]]
with open('output.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerows(data)
用 pandas.to_csv 更省心,但会隐式转义和类型转换
如果你的数据含混合类型(比如数字和字符串混在一行)、空值、逗号或引号,pandas.to_csv 会自动加引号、转义,还默认把 None 写成 nan——这未必是你想要的。
它默认开启 index=True,第一列会多出索引号;默认不写 BOM,中文在 Excel 里可能乱码;而且会把纯数字字符串(如 '00123')当数值读,再写回去就变成 123。
- 关掉索引:
df.to_csv('out.csv', index=False) - 保留原始字符串格式:构造
pd.DataFrame时加dtype=str,或用keep_default_na=False防止None→nan - 中文正常显示:加
encoding='utf-8-sig'(和csv.writer一样)
import pandas as pd
data = [['姓名', '年龄'], ['张三', '25'], ['李四', '00123']]
df = pd.DataFrame(data[1:], columns=data[0], dtype=str) # 强制全字符串
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
写入前要不要先检查二维列表结构?
两种方式都要求每行长度一致,否则 csv.writer 会报 sequence expected,pandas 则可能生成错位列或填充 NaN。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
尤其从字典列表转来时(如 [{'a':1,'b':2}, {'a':3}]),第二行缺 b 字段,直接转二维列表就会不齐。这时候不能硬塞,得先对齐。
- 用
csv.DictWriter更稳妥:它接受字段名和字典列表,自动补缺失键(配restval='') - 用
pandas时,直接传字典列表给pd.DataFrame(),它会自动对齐字段,空位填NaN,再用fillna('')替换 - 手写校验:用
all(len(row) == len(data[0]) for row in data)快速断言
大文件写入性能差异在哪?
写几万行以内,两者差别不大;但超过十万行,csv.writer 明显更快——它不建 DataFrame、不推断类型、不走 pandas 的 IO 层。
pandas.to_csv 默认启用压缩、缓冲、日期解析等额外逻辑,哪怕你没用到。如果只是“倒数据”,别为省几行代码引入 pandas。
- 纯写入场景(无计算、无清洗):优先选
csv.writer,启动快、内存低、可控性强 - 后续还要做筛选/合并/统计:直接上
pandas,避免重复加载 - 注意
to_csv的chunksize参数只用于读取,写入不支持分块;真要流式写大文件,还是得靠csv.writer+ 分批writerows
实际项目里,很多人卡在 Excel 打不开、中文变问号、数字前面的 0 消失——这些问题几乎都出在编码、索引、类型推断这三个点上,而不是语法不会写。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










