
影刀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(rC:\data\source.csv,rb)asf:resultchardet.detect(f.read())encodingresult[encoding]print(f检测到编码{encoding}置信度{result[confidence]:.1%})# 步骤2用检测到的编码读取dfpd.read_csv(rC:\data\source.csv,encodingencoding,# 或直接指定 utf-8 / gbkdtypestr,# 关键所有列按字符串读避免数字被自动转换[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_naFalse,# 空字符串不要自动变成NaN)print(f读取完成{len(df)}行{len(df.columns)}列)# 步骤3写入ExcelExcel自带编码信息不存在乱码问题df.to_excel(rC:\data\output.xlsx,indexFalse,engineopenpyxl)print(转换完成)关键参数解释dtypestr强制所有列按字符串类型读取。防止00123变成123防止金额自动转成浮点数。keep_default_naFalsepandas默认会把空字符串、‘NA’、NULL’等识别为NaN。设成False后空字符串就是空字符串不被替换。encoding先用chardet自动检测比手动猜更可靠。Excel → CSV标准转换流程importpandasaspd# Excel → CSV dfpd.read_excel(rC:\data\source.xlsx,dtypestr)df.to_csv(rC:\data\output.csv,indexFalse,encodingutf-8-sig,# 用BOM的UTF-8Excel打开不会乱码quoting1,# QUOTE_ALL所有字段都加引号避免逗号冲突)print(转换完成)关键参数解释encodingutf-8-sig在文件开头加BOMByte Order Mark。Excel打开UTF-8 CSV时靠BOM来识别编码。没有BOMExcel默认当ANSI打开中文就乱码。utf-8-sig就是带BOM的UTF-8。quoting1csv.QUOTE_ALL所有字段都用引号包裹。这样字段里即使包含逗号、换行符也不会被误解析。# quoting1的输出效果 订单号,客户名,金额,备注 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。特殊场景处理场景1CSV分隔符不是逗号有些CSV用分号、tab、竖线做分隔符# 分号分隔的CSV欧洲常见dfpd.read_csv(data.csv,sep;,encodingutf-8)# Tab分隔的文件dfpd.read_csv(data.tsv,sep\t,encodingutf-8)# 竖线分隔dfpd.read_csv(data.txt,sep|,encodingutf-8)场景2CSV文件超大超过Excel的行数限制Excel一个Sheet最多1048576行。如果CSV超过这个数转成Excel需要拆分importpandasaspd chunk_size900000# 每90万行一个Excel文件chunk_num0forchunkinpd.read_csv(big_data.csv,chunksizechunk_size,dtypestr):chunk_num1outputfbig_data_part{chunk_num}.xlsxchunk.to_excel(output,indexFalse)print(f{output}{len(chunk)}行)场景3CSV中的数字前缀零丢失产品编码000123存到CSVExcel打开时自动识别为数字变成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重点在编码检测和dtypestrExcel转CSV重点在utf-8-sig和quoting1。能把CSV替换成xlsx就替换。作者林焱