Python 解决 CSV 文件乱码:utf-8-sig 编码详解

Ivy
Ivy
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析 Python 写入 CSV 文件时出现乱码的原因及解决方案。通过对比不指定编码、utf-8 和 utf-8-sig 三种方式,指出 Excel 读取 CSV 依赖文件头部的 BOM 信息。推荐使用 utf-8-sig 编码格式,确保中文等多字节字符在 Excel 中正常显示,同时适用于 txt 文件写入。

Python CSV 与 TXT 编码对比示例

首先通过具体示例,分别采用 不指定编码、指定编码为 utf-8 以及 指定编码为 utf-8-sig 这三种不同策略进行对比,并将结果应用于写入 csv 文件与 txt 文件的场景中,以观察差异。

不指定编码存入 CSV

一、不指定编码方式,直接存入 csv 文件


import csv

with open('test.csv', 'w') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])

在此情况下运行程序,系统会抛出如下错误信息:

UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 14: illegal multibyte sequence

指定 utf-8 编码存入 CSV

二、指定编码为 utf-8,再存入 csv 文件

接下来尝试将内容以 utf-8 编码方式存入 test.csv 文件中,观察发现除了英文字符外,其他语言字符均显示为乱码:


import csv

with open('test.csv', 'w', encoding='utf-8') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])

指定 utf-8-sig 编码存入 CSV

三、指定编码为 utf-8-sig,再存入 csv 文件

当将编码方式更换为 utf-8-sig 之后,文件内容显示恢复正常:


import csv

with open('test.csv', 'w', encoding='utf-8-sig') as fp:
 writer = csv.writer(fp)
 writer.writerow(['汉语', '俄语', '韩语', '日语', '英语'])
 writer.writerow(['爱你', 'люблю тебя', '사랑해요', '愛しています', 'love you'])

不指定编码存入 TXT

四、不指定编码方式,直接存入 txt 文件


with open('test.txt','w') as fp:
 fp.write('爱你, люблю тебя, 사랑해요, 愛しています, love you')

与存入 csv 文件的情况类似,同样会触发以下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\uc0ac' in position 16: illegal multibyte sequence

指定编码存入 TXT

五、指定编码为 utf-8 / utf-8-sig,再存入 txt 文件

分别以 utf-8 或者 utf-8-sig 编码方式存入 test.txt 文件中,内容显示均完全正常:


ith open('test.txt','w', encoding='utf-8') as fp:
  fp.write('爱你, люблю тебя, 사랑해요, 愛しています, love you')

with open('test.txt','w', encoding='utf-8-sig') as fp:
  fp.write('爱你, люблю тебя, 사랑해요, 愛しています, love you')

utf-8 与 utf-8-sig 的区别

utf-8 与 utf-8-sig 有什么区别?

  • utf-8 以字节为编码单元,其字节顺序在所有系统中保持一致,不存在字节序问题,因此实际上并不需要 BOM;
  • uft-8-sig 中 sig 全拼为 signature,即带有签名的 utf-8(UTF-8 with BOM);
  • BOM 全称 ByteOrder Mark,字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码。

CSV 文件使用 utf-8-sig 的原因

为什么写入 csv 文件要用 utf-8-sig 编码?

  • Excel 在读取 csv 文件时,是通过读取文件头上的 BOM 来识别编码格式的。如果文件头没有 BOM 信息,Excel 则默认按照 Unicode 编码进行读取。
  • 当我们使用 utf-8 编码来生成 csv 文件时,由于并未生成 BOM 信息,Excel 会自动按照 Unicode 编码读取,从而导致出现乱码问题。

TXT 文件使用 utf-8 编码的原因

为什么写入 txt 文件要用 utf-8 编码?

在写入 txt 文件时,Windows 系统会默认尝试转码为 gbk。如果遇到某些 gbk 不支持的字符,就会报错。如果在打开文件时明确声明编码方式为 utf-8,就能避免这个错误。

知识点扩展:utf-8 与 utf-8-sig 详细区别

知识点扩展:

utf-8 和 utf-8-sig 的区别

前言:在写入 csv 文件中,出现了乱码的问题。

解决:utf-8 改为 utf-8-sig

区别如下:

1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,因此它不需要 BOM,所以当用 "utf-8" 编码方式读取带有 BOM 的文件时,它会把 BOM 当做是文件内容来处理,也就会发生类似上边的错误。

2、“uft-8-sig" 中 sig 全拼为 signature,也就是 "带有签名的 utf-8",因此 "utf-8-sig" 读取带有 BOM 的 "utf-8 文件时" 会把 BOM 单独处理,与文本内容隔离开,也是我们期望的结果。

总结

以上所述是小编给大家介绍的 Python 利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题,希望对大家有所帮助,也非常感谢大家对本站网站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表