【问题标题】:Reading UTF8 encoded CSV and converting to UTF-16读取 UTF8 编码的 CSV 并转换为 UTF-16
【发布时间】:2013-08-31 10:21:12
【问题描述】:

我正在读取具有 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,因此我可以使用这种方法。

【问题讨论】:

    标签: python csv unicode encoding utf-8


    【解决方案1】:

    您的默认编码是 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 十六进制转义而不是 @987654327 @unicode 代码点符号,用于将 00 作为最重要字节以节省空间的代码点(它也可以将其显示为 \u00c1。)

    为了更好地了解 Unicode 在 Python 中的工作原理,我建议http://nedbatchelder.com/text/unipain.html

    【讨论】:

    • 嘿,谢谢。这有很大帮助。这一切都开始适应了——python(和解释器+标准输出)如何管理 unicode 等让我感到困惑,但我认为现在很清楚了。那个视频也很棒。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2017-08-24
    • 2015-09-06
    • 2014-03-05
    • 2011-08-23
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多