Python导出CSV:UTF-8法语乱码、UTF-16分隔符失效问题
Python导出CSV编码兼容问题解决方案
问题现象
- 导出CSV时使用
utf-8编码:逗号分隔符可被表格工具正常识别、数据自动分列,但法语带重音类特殊字符显示乱码 - 导出CSV时使用
utf-16编码:法语特殊字符可正常显示,但表格工具无法识别逗号分隔符,所有内容挤在同一列
问题原有实现代码:
def data_to_csv(data): keys = data[0].keys() with open('data.csv', 'w', newline='', encoding="utf-16") as output_file: dict_writer = csv.DictWriter(output_file, keys, delimiter=",") dict_writer.writeheader() dict_writer.writerows(data)
根因说明
utf-8编码下的乱码问题:Windows平台的Excel/WPS默认使用系统本地编码识别无BOM头的UTF-8文件,不会自动判定编码格式,导致非ASCII字符(如法语重音字符)解析乱码utf-16编码下的不分列问题:Python默认utf-16编码会根据运行平台选择字节序,未写入符合Windows表格工具识别规则的BOM头,同时csv模块默认输出格式未匹配UTF-16下Excel的解析规则,导致分隔符无法识别
推荐解决方案(99%场景适用)
直接将编码参数替换为utf-8-sig即可,该编码会在文件开头写入UTF-8格式的BOM标识,Windows平台的表格工具会自动识别文件为UTF-8编码,同时解决乱码和分列异常问题,且文件体积远小于UTF-16格式。
修正后可直接运行的代码:
import csv def data_to_csv(data): keys = data[0].keys() # 仅修改encoding参数为utf-8-sig,其余原有逻辑无需调整 with open('data.csv', 'w', newline='', encoding="utf-8-sig") as output_file: dict_writer = csv.DictWriter(output_file, keys, delimiter=",") dict_writer.writeheader() dict_writer.writerows(data)
强制使用UTF-16场景的适配方案
如果业务规则要求必须使用UTF-16编码,需手动指定小端序UTF-16编码、写入对应BOM头,同时显式指定csv写入方言为Excel兼容格式,修正代码如下:
import csv def data_to_csv(data): keys = data[0].keys() # 指定使用小端序UTF-16,适配Windows平台默认解析规则 with open('data.csv', 'w', newline='', encoding="utf-16-le") as output_file: # 手动写入UTF-16格式的BOM头 output_file.write('\ufeff') dict_writer = csv.DictWriter( output_file, keys, delimiter=",", dialect="excel" # 显式指定Excel兼容方言,确保分隔符、行尾可被识别 ) dict_writer.writeheader() dict_writer.writerows(data)
注意:不要直接使用
encoding="utf-16"默认参数,该参数在不同操作系统下的字节序表现不一致,极易出现解析兼容问题。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

