Tim*_*ony 2 python csv unicode encoding utf-8
我正在读取具有UTF8编码的CSV文件:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
print repr(row[0])
Run Code Online (Sandbox Code Playgroud)
这很好用,并打印出我希望它打印出来的东西; UTF8编码str:
> '\xc3\x81lvaro Salazar'
> '\xc3\x89lodie Yung'
...
Run Code Online (Sandbox Code Playgroud)
此外,当我只是打印str(而不是repr())输出显示确定(我不明白 - 这不应该导致错误吗?):
> Álvaro Salazar
> Élodie Yung
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将我的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')
Run Code Online (Sandbox Code Playgroud)
我得到了臭名昭着的:
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)
Run Code Online (Sandbox Code Playgroud)
所以我查看了创建的unicode字符串:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
unicode_name = unicode(name, 'utf-8')
print repr(unicode_name)
Run Code Online (Sandbox Code Playgroud)
而输出是
> u'\xc1lvaro Salazar'
> u'\xc9lodie Yung'
Run Code Online (Sandbox Code Playgroud)
所以现在我完全感到困惑,因为这些似乎是错误的十六进制值.我读过这个问题:
看起来我正在做的一切正确,让我相信我的文件实际上不是UTF8,但是当我最初打印出repr单元格的值时,它们似乎要纠正UTF8十六进制值.任何人都可以指出我的问题或指出我的理解在哪里崩溃(因为我开始迷失在编码的丛林中)
顺便说一句,我相信我可以codecs用来打开文件并将其直接读入unicode对象,但该csv模块本身不支持unicode,所以我可以使用这种方法.
您的默认编码是ASCII.当您尝试打印unicode对象时,解释器因此尝试使用ASCII编解码器对其进行编码,该编解码器失败,因为您的文本包含ASCII中不存在的字符.
打印UTF-8编码的字节串不会产生错误(这似乎让您感到困惑,尽管它不应该)的原因是这只是将字节发送到您的终端.它永远不会产生Python错误,但如果你的终端不知道如何处理字节,它可能会产生丑陋的输出.
要打印unicode,请使用print some_unicode.encode('utf-8').(或者您的终端实际使用的任何编码).
至于u'\xc1lvaro Salazar',这里没有任何东西被破坏.该字符Á位于unicode代码点C1(与它的UTF-8表示无关,但恰好与Latin-1中的值相同),并且Python使用\x十六进制转义而不是\uunicode代码点表示法来处理00作为节省空间的最重要的字节(它也可以显示为\u00c1.)
为了更好地概述Unicode如何在Python中工作,我建议http://nedbatchelder.com/text/unipain.html