【问题标题】:Reading Unicode Files - Python3.2读取 Unicode 文件 - Python3.2
【发布时间】:2012-05-05 23:20:24
【问题描述】:

我正在尝试使用 Python3.2 读取一些文件,其中一些文件可能包含 unicode,而另一些则不包含。

当我尝试时:

file = open(item_path + item, encoding="utf-8")
for line in file:
    print (repr(line))

我得到错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(128)

我正在关注这里的文档:http://docs.python.org/release/3.0.1/howto/unicode.html

为什么 Python 会在这段代码中的任何时候尝试编码为 ascii?

【问题讨论】:

  • 明确一点:当你在这里写 Unicode 时,你的意思是 UTF-8?此外,听起来所有文件都是 UTF-8,但有些可能只包含也是 ASCII 的子集。

标签: python unicode file-io python-3.x


【解决方案1】:

问题是 Python 3 中的 repr(line) 也返回 Unicode 字符串。它不会将上述 128 个字符转换为 ASCII 转义序列。

如果您想查看转义序列,请改用ascii(line)

实际上,repr(line) 应该返回一个字符串,如果放在源代码中会产生具有相同值的对象。这样,Python 3 的行为就很好了,因为不需要在源文件中使用 ASCII 转义序列来表达超过 ASCII 字符的字符串。如今,使用 UTF-8 或其他一些 Unicode 编码是很自然的。事实上,Python 2 为这些字符生成了转义序列。

【讨论】:

    【解决方案2】:

    您的输出编码是什么?如果您删除对print() 的调用,它会开始工作吗?

    我怀疑您使用的是非 UTF-8 语言环境,因此 Python 尝试将 repr(line) 编码为 ASCII 作为打印的一部分。

    要解决此问题,您必须对字符串进行编码并打印字节数组,或者将默认编码设置为可以处理字符串的编码(UTF-8 是显而易见的选择)。

    【讨论】:

    • 是的,你是对的。只有打印导致问题,当我将这些行传递给其他东西(例如,QListView)时,它们看起来很好。
    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2013-06-30
    • 2010-11-02
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多