You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

根因说明

  1. utf-8编码下的乱码问题:Windows平台的Excel/WPS默认使用系统本地编码识别无BOM头的UTF-8文件,不会自动判定编码格式,导致非ASCII字符(如法语重音字符)解析乱码
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:54:22