【问题标题】:UnicodeError Reading Accentuation Portuguese Characters from FileUnicodeError 从文件中读取重音葡萄牙语字符
【发布时间】:2016-05-18 14:37:09
【问题描述】:

前言:

2016 年年中的一个寒冷的雨天,开发人员仍然因为没有使用 Python 3.0 而遇到 Python 编码问题。伟大的 S.O 社区会帮助他吗?不知道,我们拭目以待

范围:

我有一个UTF-8 encoded file,其中包含带有重音的单词,例如CURRÍCULONÓS。由于某种我无法理解的原因,我无法使用 Python 2.7 正确阅读它们。

代码片段:

import codecs

f_reader = codecs.open('PATH_TO_FILE/Data/Input/kw.txt', 'r', encoding='utf-8')

for line in f_reader:
    keywords.append(line.strip().upper())
    print line

我得到的输出是:

TRABALHE CONOSCO
ENVIE SEU CURRICULO
ENVIE SEU CURRÍCULO  
UnicodeEncodeError, 'ascii' codec can't encode character u'\xcd' in position 14: ordinal not in range(128)

编码、编码、编码:

我使用 notepad++ 将文件转换为常规 utf-8 和没有 ByteOrderMark 的文件,它向我显示字符很好,没有任何问题。顺便说一句,我使用的是 Windows,默认情况下它将创建文件为 ANSI。

问题:

我应该怎么做才能正确读取这个文件,包括íó和其他重音字符?

为了更清楚,我想在内存中使用的字符串上keep the accentuation

更新:

这是关键字列表,在内存中,使用您可以看到的代码从文件中读取。

【问题讨论】:

  • 他们读得很好。阅读完整的回溯。
  • @IgnacioVazquez-Abrams 你能定义“很好”吗?理论上,程序在尝试将其编码为与文件所在的相同编码时会崩溃。我错过了什么?
  • 你读过回溯吗?
  • @IgnacioVazquez-Abrams 你的意思是,“打印”打印得很好。是你的意思吗?是的,我读过。我无法理解的是为什么它在调用 print 方法之后就在这一行崩溃。它打印并崩溃。

标签: python python-2.7 encoding utf-8


【解决方案1】:

问题似乎不在于阅读,而在于印刷。你伤心

顺便说一下,我使用的是 Windows,默认情况下它会将文件创建为 ANSI。

我认为这包括打印到stdout。尝试更改sys.output 编解码器:

sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

【讨论】:

  • 这里是打印的关键字列表的一部分,使用“打印”方法,在使用编解码器覆盖 sys.stdout 之后:[u'TRABALHE CONOSCO', u'ENVIE SEU CURRICULO', u'ENVIE SEU CURR\xcdCULO', u'MANDE SEU CURR\xcdCULO']
  • 没错。这是使用repr 打印列表中的每个元素。例如,尝试打印u", ".join(keywords)。或者将每一行打印到一个文件中,然后打开文件检查编码。
  • u','.join(keywords) 给了我ascii' codec can't decode byte 0xc3 in position 51: ordinal not in range(128) 错误。有什么线索吗?
  • 我无法重现此错误。是join 还是print 的错误?尝试创建一个中间变量:x = u", ".join(keywords)print x 看看。
  • 请注意,您不能将“普通字符串”与 unicode 字符串(前缀 u)混合使用。也许您应该在代码中的相应字符串中添加 u 前缀。
最近更新 更多