当前位置: 首页 > news >正文

影刀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就替换。


作者:林焱

http://www.jsqmd.com/news/1144342/

相关文章:

  • 工业负载控制方案:TPD2015FN与PIC18F45K22应用解析
  • 工业信号隔离与抗干扰设计实战
  • MySQL EXISTS 子查询优化:5 个常见低效写法与改写方案
  • Windows Server 2022 防火墙高级配置:组策略批量部署 3 类规则
  • MyBatis 批量操作深度优化——从 N+1 到批处理的全路径
  • 国家中小学智慧教育平台电子课本下载工具:三步解决教育资源获取难题
  • 扩散模型图像恢复实战:基于RDBM的5种天气退化处理,PSNR平均提升1.55dB
  • Bilibili视频下载器:技术架构与4K高清下载完整指南
  • Hyper-V 虚拟机配置优化:Win7 分配 4GB 内存与 40GB 硬盘的实测性能对比
  • ZooKeeper 3.9.5 集群部署实战:3节点Docker Compose配置与Leader选举验证
  • QQScreenShot独立版终极指南:5分钟掌握免登录专业截图工具
  • CSS 多级菜单性能对比:Flexbox vs Grid vs Float 3 种布局方案实测
  • VMware ESXi 7.0 与 8.0 安装对比:5个关键配置差异与升级决策
  • 逻辑漏洞实战指南:从业务理解到漏洞挖掘的完整框架
  • ByteHouse:云原生数据仓库的架构解析与最佳实践
  • BetterNCM安装器:高效管理网易云插件的最佳选择
  • CentOS 8 镜像源失效排查:3步定位与阿里云/清华源切换方案
  • Win10 Hyper-V 安装 Win7 虚拟机:3 个常见报错(如无 Hyper-V 选项)的排查与解决
  • PHP 反序列化字符逃逸:filter函数替换导致长度变化的3种攻击场景分析
  • MySQL 条件汇总进阶:5 个复杂报表场景的 SUM(IF()) 与 GROUP BY 组合技巧
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理
  • 全尺寸报告(Full Dimension Report)标准化编制与数字化指南
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • 7-Zip漏洞CVE-2024-38366:绕过Windows安全标记的压缩包攻击解析
  • Windows 11 22H2 双显卡排错指南:5步解决程序错误调用集显问题
  • Docker CE 24.0 在 CentOS 7/8 的 5 步安装与 3 步卸载完整流程
  • 作为一个给团队打绩效的人,我想说几句
  • Docker 26.0 安装后 5 项必做配置:镜像加速、用户组与存储驱动优化
  • 高德地图 JS API 2.0 海量标注优化:3500+数据下首屏加载提速4倍实战
  • PROPKA 3深度解析:蛋白质pKa预测的实战指南与算法原理