excel打开csv中文乱码根本原因是编码不匹配:csv为utf-8而excel默认用ansi读取;必须用utf-8 with bom格式或python中指定encoding='utf-8-sig',且xml解析、csv写入、命令行导出各环节均需显式声明utf-8编码。

Excel打开CSV中文显示为问号或方块
根本原因是Excel默认用系统ANSI编码(如Windows-1252)读取CSV,而你的XML转出的CSV实际是UTF-8编码——两者不匹配就必然乱码。
别指望Excel自动识别BOM,它对UTF-8 BOM的支持极不稳定,尤其Win10/11新版Excel常直接忽略。
- 最稳妥做法:用
notepad++或vscode打开CSV,另存为「UTF-8 with BOM」格式(不是纯UTF-8) - 如果必须用Python生成CSV,务必在
open()中指定encoding='utf-8-sig'——这个-sig后缀会自动写入BOM - 用
pandas.to_csv()时,加参数encoding='utf-8-sig',否则默认utf-8无BOM,Excel照样认不出
从XML解析后写CSV时字段含逗号、换行、引号
XML里文本节点经常带换行符或内部逗号,直接csv.writer写入不加处理,Excel打开会错列甚至崩溃。
Python的csv模块本身能处理这些,但前提是:你得用它原生的写法,而不是手动拼字符串。
- 绝对不要用
f.write(f"{a},{b},{c}")这种写法——它完全绕过CSV规范,引号、转义全失效 - 必须用
csv.writer(f).writerow([a, b, c]),它会自动判断是否需要包裹双引号、是否要转义内部双引号 - 如果字段含Windows风格换行
\r\n,csv.writer默认不处理,建议提前替换为\n再写入
用xml.etree.ElementTree解析XML后中文字段变乱码
不是CSV的问题,是XML读取阶段就错了。常见于用open()直接读XML文件却没指定编码。
即使XML声明了<?xml version="1.0" encoding="UTF-8"?>,Python的open()也不会自动按这个声明解码——它只看你自己传的encoding参数。
- 读XML文件时,必须显式写
open('data.xml', encoding='utf-8'),不能依赖文件头 - 如果XML来自网络请求(如
requests.get().text),检查r.encoding是否正确;更可靠的是用r.content配合ET.fromstring(),避免str解码干扰 - 用
lxml.etree替代标准库时,同样要传encoding='utf-8'给parse()或fromstring()
PowerShell或命令行转CSV时中文全变成
PowerShell默认用UTF-16 LE输出,而大多数CSV工具(包括Excel)期待UTF-8。直接重定向> out.csv等于埋雷。
cmd更糟——它用当前代码页(通常是GBK),遇到UTF-8源数据必然炸。
- PowerShell中用
Export-Csv -Encoding UTF8(PowerShell 6+),旧版PowerShell 5.1不支持UTF8参数,得用Out-File -Encoding utf8配合ConvertTo-Csv - cmd下别硬刚,改用
python -c "import sys; print(','.join(sys.argv[1:]))" 你好 世界 > out.csv这类临时方案,本质是靠Python处理编码 - 任何命令行管道操作,只要中间环节没指定编码,就默认丢失中文——宁可多写一行Python,也别信默认值
真正麻烦的从来不是“怎么转”,而是每个环节都默认放弃中文兼容性。BOM、encoding参数、XML声明、终端代码页……漏掉任意一个,前面全白干。










