影刀RPA Excel与CSV互转的编码陷阱:中文不乱码的正确转换
影刀RPA Excel与CSV互转的编码陷阱:中文不乱码的正确转换
CSV看起来简单——逗号分隔的文本文件嘛。但中文字符一上去,问题就来了:读出来全是乱码、逗号在文本里被截断、数字前面的零消失了。
这篇文章把Excel和CSV互转的所有坑讲透,给一个"再也不乱码"的标准模板。
CSV为什么容易出问题
CSV本质上就是一个纯文本文件。它不存储任何编码信息、不存储数据类型、不存储格式。当你用文本编辑器打开一个CSV文件时:
订单号,客户名,金额,日期 ORD001,张三贸易,3580.50,2026-07-01 ORD002,李四科技,12000.00,2026-07-01看起来很简单。但问题都藏在"看起来"里:
编码不明确:这个文件是UTF-8还是GBK?文本编辑器猜一个,猜错了就乱码。
逗号冲突:如果数据里有逗号(“张三,贸易公司”),CSV会被切成三列而不是两列。
数字精度丢失:
00123存到CSV里被Excel打开时自动变成123。换行符干扰:如果某个字段里包含换行符,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","多行  的备注也能正常处理"影刀中的CSV操作
影刀内置的【读取CSV】和【写入CSV】动作在编码处理上比较弱,中文场景容易乱码。建议在Python节点里处理。
如果非要用影刀内置动作,记住两个要点:
- 写入CSV时:【写入CSV】动作的属性里有一个"编码"选项,选
UTF-8。 - 读取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格式:
| 维度 | CSV | XLSX |
|---|---|---|
| 编码风险 | 高(无编码标识) | 无(自带编码) |
| 数字精度 | 易丢失 | 可保持 |
| 多Sheet | 不支持 | 支持 |
| 格式 | 不支持 | 支持 |
| 文件大小 | 小 | 中等 |
| 跨平台兼容 | 好 | 好 |
只有在必须跟外部系统对接(对方只收CSV)时才用CSV。流程内部的中转文件一律用.xlsx。
一句话:CSV转Excel重点在编码检测和dtype=str;Excel转CSV重点在utf-8-sig和quoting=1。能把CSV替换成xlsx就替换。
作者:林焱