影刀RPA Excel与CSV互转的编码陷阱:中文不乱码的正确转换

影刀RPA Excel与CSV互转的编码陷阱:中文不乱码的正确转换

CSV看起来简单——逗号分隔的文本文件嘛。但中文字符一上去,问题就来了:读出来全是乱码、逗号在文本里被截断、数字前面的零消失了。

这篇文章把Excel和CSV互转的所有坑讲透,给一个"再也不乱码"的标准模板。


CSV为什么容易出问题

CSV本质上就是一个纯文本文件。它不存储任何编码信息、不存储数据类型、不存储格式。当你用文本编辑器打开一个CSV文件时:

订单号,客户名,金额,日期 ORD001,张三贸易,3580.50,2026-07-01 ORD002,李四科技,12000.00,2026-07-01

看起来很简单。但问题都藏在"看起来"里:

  1. 编码不明确:这个文件是UTF-8还是GBK?文本编辑器猜一个,猜错了就乱码。

  2. 逗号冲突:如果数据里有逗号(“张三,贸易公司”),CSV会被切成三列而不是两列。

  3. 数字精度丢失00123存到CSV里被Excel打开时自动变成123

  4. 换行符干扰:如果某个字段里包含换行符,CSV的一行变成了多行。


CSV → Excel:标准转换流程

importpandasaspd# === CSV → Excel(解决乱码和类型问题)===# 步骤1:检测编码importchardetwithopen(r'C:\data\source.csv','rb')asf:result=chardet.detect(f.read())encoding=result['encoding']print(f'检测到编码:{encoding}(置信度:{result["confidence"]:.1%})')# 步骤2:用检测到的编码读取df=pd.read_csv(r'C:\data\source.csv',encoding=encoding,# 或直接指定 'utf-8' / 'gbk'dtype=str,# 关键!所有列按字符串读,避免数字被自动转换[video(video-a6LqGZIO-1783410945930)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架!)]keep_default_na=False,# 空字符串不要自动变成NaN)print(f'读取完成:{len(df)}行,{len(df.columns)}列')# 步骤3:写入Excel(Excel自带编码信息,不存在乱码问题)df.to_excel(r'C:\data\output.xlsx',index=False,engine='openpyxl')print('转换完成')

关键参数解释

  • dtype=str:强制所有列按字符串类型读取。防止00123变成123,防止金额自动转成浮点数。
  • keep_default_na=False:pandas默认会把空字符串、‘NA’、'NULL’等识别为NaN。设成False后空字符串就是空字符串,不被替换。
  • encoding:先用chardet自动检测,比手动猜更可靠。

Excel → CSV:标准转换流程

importpandasaspd# === Excel → CSV ===df=pd.read_excel(r'C:\data\source.xlsx',dtype=str)df.to_csv(r'C:\data\output.csv',index=False,encoding='utf-8-sig',# 用BOM的UTF-8,Excel打开不会乱码quoting=1,# QUOTE_ALL:所有字段都加引号,避免逗号冲突)print('转换完成')

关键参数解释

  • encoding='utf-8-sig':在文件开头加BOM(Byte Order Mark)。Excel打开UTF-8 CSV时靠BOM来识别编码。没有BOM,Excel默认当ANSI打开,中文就乱码。utf-8-sig就是带BOM的UTF-8。
  • quoting=1(csv.QUOTE_ALL):所有字段都用引号包裹。这样字段里即使包含逗号、换行符,也不会被误解析。
# quoting=1的输出效果: "订单号","客户名","金额","备注" "ORD001","张三,贸易公司","3580.50","包含,逗号也没问题" "ORD002","李四科技","12000.00","多行 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4677bda02e014beda4489daa5437da1a.png#pic_center) 的备注也能正常处理"

影刀中的CSV操作

影刀内置的【读取CSV】和【写入CSV】动作在编码处理上比较弱,中文场景容易乱码。建议在Python节点里处理。

如果非要用影刀内置动作,记住两个要点:

  1. 写入CSV时:【写入CSV】动作的属性里有一个"编码"选项,选UTF-8
  2. 读取CSV时:【读取CSV】动作同样有编码选项,也要设置。但如果CSV是GBK编码的而你没意识到,选了UTF-8就读出来乱码。

判断CSV编码:用记事本打开CSV文件 → 文件 → 另存为 → 看底部"编码"下拉框显示的是什么。如果是"UTF-8",那就是UTF-8编码。如果是"ANSI",多半是GBK。


特殊场景处理

场景1:CSV分隔符不是逗号

有些CSV用分号、tab、竖线做分隔符:

# 分号分隔的CSV(欧洲常见)df=pd.read_csv('data.csv',sep=';',encoding='utf-8')# Tab分隔的文件df=pd.read_csv('data.tsv',sep='\t',encoding='utf-8')# 竖线分隔df=pd.read_csv('data.txt',sep='|',encoding='utf-8')

场景2:CSV文件超大(超过Excel的行数限制)

Excel一个Sheet最多1048576行。如果CSV超过这个数,转成Excel需要拆分:

importpandasaspd chunk_size=900000# 每90万行一个Excel文件chunk_num=0forchunkinpd.read_csv('big_data.csv',chunksize=chunk_size,dtype=str):chunk_num+=1output=f'big_data_part{chunk_num}.xlsx'chunk.to_excel(output,index=False)print(f'{output}{len(chunk)}行')

场景3:CSV中的数字前缀零丢失

产品编码000123存到CSV,Excel打开时自动识别为数字,变成123

TEMU店群矩阵自动化运营核价报活动


预防:在Python里写入CSV时给这些字段加一个制表符前缀或单引号前缀:

# 写入时给可能以0开头的列加前缀df['产品编码']=df['产品编码'].apply(lambdax:f'\t{x}')# 制表符前缀,Excel识别为文本

或者在Excel里设置列格式为"文本"(但这需要在openpyxl层面设置格式,不适用于CSV)。

从根本上解决:能不用CSV就不用了,直接存成.xlsx.xlsx支持列格式设置,数字前面的零不会丢。


为什么建议用xlsx替代CSV

做RPA自动化时,如果条件允许,尽量在流程内部使用.xlsx格式:

维度CSVXLSX
编码风险高(无编码标识)无(自带编码)
数字精度易丢失可保持
多Sheet不支持支持
格式不支持支持
文件大小中等
跨平台兼容

只有在必须跟外部系统对接(对方只收CSV)时才用CSV。流程内部的中转文件一律用.xlsx


一句话:CSV转Excel重点在编码检测和dtype=str;Excel转CSV重点在utf-8-sigquoting=1。能把CSV替换成xlsx就替换。


作者:林焱