CSV保存失败主因有四:①Windows下Excel默认读gbk或utf-8-sig,须用encoding='utf-8-sig';②含换行符/逗号字段需清洗或quoting=csv.QUOTE_ALL;③大数据量应分块追加写入防OOM;④时间字段须统一转datetime64并处理时区。

CSV保存失败:pandas to_csv() 报错 UnicodeEncodeError
中文或特殊字符写入 CSV 时,to_csv() 默认用 'utf-8' 编码,但 Windows 下 Excel 默认读取 gbk 或带 BOM 的 utf-8-sig,直接双击打开就乱码或报错。
实操建议:
- Windows 环境下务必显式指定
encoding='utf-8-sig',这是最稳妥的兼容方案 - 避免用
encoding='gbk'—— 遇到 emoji、繁体字、数学符号会直接抛UnicodeEncodeError - 如果后续只用 Python 读(比如再用
pandas.read_csv()),encoding='utf-8'没问题;但只要有人用 Excel 打开,就必须utf-8-sig
示例:
df.to_csv('data.csv', encoding='utf-8-sig', index=False)
字段含换行符或逗号:CSV 格式被破坏
爬虫抓到的文本常含 \n、\r 或英文逗号(如地址、简介),不处理会导致 CSV 行数错乱、列偏移,Excel 里整行“塌”成一列。
立即学习“Python免费学习笔记(深入)”;
实操建议:
- pandas 默认用双引号包裹含特殊字符的字段(
quoting=csv.QUOTE_MINIMAL),但前提是字段是字符串类型;如果字段是None或数字,不会自动加引号 - 提前清洗:用
df[cols] = df[cols].astype(str).str.replace(r'[\r\n,]', ' ', regex=True)替换掉危险字符(注意保留原意的前提下) - 更安全的做法是强制所有字符串字段加引号:
df.to_csv(..., quoting=csv.QUOTE_ALL),需先import csv
数据量大时卡死或内存爆掉
一次性把几百万行 DataFrame 全塞进内存再调 to_csv(),容易触发 OOM,尤其在低配机器或云函数环境。
实操建议:
- 别等全部爬完再存 —— 边爬边存,用
mode='a'追加写入(首次需手动写 header) - 控制 chunk 大小:每抓 1000 条就
pd.DataFrame(chunk_list).to_csv(..., mode='a', header=first_write, index=False),first_write初始为True,之后设为False - 避免反复打开/关闭文件句柄;用
open(...)手动管理文件对象 +df.to_csv(f, ...)更可控
时间字段变成数字或时区错乱
爬到的日期字符串(如 "2024-05-20 14:30:00")若没转成 datetime64 类型,to_csv() 会原样输出;但若用了 parse_dates 却忽略时区,可能存成 UTC 时间戳,和原始本地时间对不上。
实操建议:
- 入库前统一转类型:
df['pub_time'] = pd.to_datetime(df['pub_time'], errors='coerce'),errors='coerce'把非法值变NaT而非报错 - 保存时不强制转时间戳 ——
to_csv()默认把datetime64输出为可读字符串(如2024-05-20 14:30:00),除非你设了date_format - 若原始数据有时区(如
"2024-05-20 14:30:00+08:00"),转完后用.dt.tz_localize(None)去时区,避免 Excel 误解析
真正麻烦的不是语法,而是你永远不知道网页里藏了多少种日期格式、空格变体、不可见控制符——多加一行 df.applymap(type) 快速探查,比硬试强得多。


















