Python CSV 写入器与 UTF-8 编码格式

3 投票
1 回答
6195 浏览
提问于 2025-04-17 15:37

我正在尝试把一些荷兰语内容写入一个CSV文件,结果却出现了问题。

在下面的程序中,理想情况下,应该把"Eéntalige affiche in Halle !!"写入CSV文件。但是,实际写入的却是"Eéntalige affiche in Halle !!"

# -*- encoding: utf-8 -*-
import csv
S="Eéntalige affiche in Halle !!".encode("utf-8")
file=c = csv.writer(open("Test.csv","wb"))
file.writerow([S])

在CSV文件中== ? "Eéntalige affiche in Halle !!"

1 个回答

3

你写的数据是正确的。问题出在读取这些数据的地方;它把UTF-8格式的数据当成了Latin 1格式来解读。

>>> print('E\xe9ntalige affiche in Halle !!')
Eéntalige affiche in Halle !!
>>> 'E\xe9ntalige affiche in Halle !!'.encode('utf8')
b'E\xc3\xa9ntalige affiche in Halle !!'
>>> print('E\xe9ntalige affiche in Halle !!'.encode('utf8').decode('latin1'))
Eéntalige affiche in Halle !!

比如,U+00E9这个编码(é,带重音的E)在UTF-8中是用两个字节来表示的,分别是C3和A9(十六进制)。如果你把这两个字节当成Latin 1来处理,每个字符只占用一个字节,那么你就会得到é了。

关于CSV文件和编码的处理并没有统一的标准,所以你需要根据目标应用程序来调整编码,以便正确读取这些信息。例如,Microsoft Excel会根据当前的代码页来读取CSV文件。

如果你的CSV读取器是期待Latin 1格式,那就把数据编码成Latin 1格式吧。

撰写回答