我正在阅读具有 UTF8 编码的 CSV 文件:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
print repr(row[0])
这工作正常,并打印出我期望它打印出来的内容;UTF8 编码str
:
> '\xc3\x81lvaro Salazar'
> '\xc3\x89lodie Yung'
...
此外,当我简单地打印str
(而不是repr()
)时,输出显示正常(无论如何我都不明白 - 这不应该导致错误吗?):
> Álvaro Salazar
> Élodie Yung
但是当我尝试将我的 UTF8 编码转换strs
为unicode
:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
print unicode(name, 'utf-8') # or name.decode('utf-8')
我得到了臭名昭著的:
Traceback (most recent call last):
File "scripts/script.py", line 33, in <module>
print unicode(fullname, 'utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)
所以我查看了创建的 unicode 字符串:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
unicode_name = unicode(name, 'utf-8')
print repr(unicode_name)
输出是
> u'\xc1lvaro Salazar'
> u'\xc9lodie Yung'
所以现在我完全糊涂了,因为这些似乎是错位的十六进制值。我读过这个问题:
看来我做的一切都是正确的,这让我相信我的文件实际上不是 UTF8,但是当我最初打印出repr
单元格的值时,它们似乎可以更正 UTF8 十六进制值。谁能指出我的问题或指出我的理解在哪里崩溃(因为我开始迷失在编码的丛林中)
顺便说一句,我相信我可以codecs
用来打开文件并将其直接读入 unicode 对象,但该csv
模块本身不支持 unicode,因此我可以使用这种方法。