【问题标题】:Python: Ascii characters from file display wrongPython:文件中的 Ascii 字符显示错误
【发布时间】:2012-04-30 08:45:50
【问题描述】:

这是我的代码:

import sys, os

print("█████") #<-- Those are solid blocks.
f= open('file.txt')
for line in f:
    print(line)

在 file.txt 中是这样的:

hay hay, guys
████████████

但是输出是这样的:

██████
hay hay, guys <----- ***Looks like it outptutted this correctly!***

Traceback (most recent call last):
  File "echofile.py", line 6, in <module>
    print(line)
  File "C:\python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-2: cha
racter maps to <undefined> <------ ***But not from the file!***

有人对它为什么这样做有任何建议吗?我在 IDLE 中编写了代码,尝试在 Programmer's Notepad 和 IDLE 中编辑 file.txt。该文件是 ASCII / ANSI。 顺便说一句,我正在使用 Python 3。 3.3 alpha win-64 如果重要的话。

【问题讨论】:

    标签: python file io character-encoding ascii


    【解决方案1】:

    尝试将该字符串设为 unicode:

    print(u"█████")
          ^ Add this
    

    【讨论】:

    • 他正在使用 Python 3.x,它不再具有 u"" 语法。 Python 3.x 中的所有字符串都是 Unicode。
    • 这不是造成它的原因。打印本身工作正常,从文件打印是导致错误的原因。这也是python 3。
    • 原来答案是 Blender 的评论。以 read-binary ('rb') 的形式打开文件,然后执行 print(line.decode()) 虽然这似乎有点像 hackjob.. 有什么“干净”的方法可以做到吗?
    • @user1068392,干净的方法就是在对open()的调用中指定一个编码。有关示例代码,请参阅我的答案。
    【解决方案2】:

    这显然是字符编码的问题。

    在 Python 3.x 中,所有字符串都是 Unicode。但是在读取或写入文件时,需要将 Unicode 转换为某种特定的编码。

    默认情况下,Python 源文件被处理为 UTF-8。我不确切知道您将哪些字符粘贴到块的源文件中,但无论它是什么,Python 都将其读取为 UTF-8 并且它似乎可以工作。也许您的文本编辑器在插入时转换为有效的 UTF-8?

    回溯表明 Python 将输入文件视为“代码页 437”或原始 IBM PC 8 位字符集。对吗?

    此链接显示如何设置特定解码器以处理输入上的特定文件编码:

    http://lucumr.pocoo.org/2010/2/11/porting-to-python-3-a-guide/

    编辑:我找到了更好的资源:

    http://docs.python.org/release/3.0.1/howto/unicode.html

    基于此,这里有一些示例代码:

    with open('mytextfile.txt', encoding='utf-8') as f:
        for line in f:
            print(line, end='')
    

    最初我将上述设置为“cp437”,但在评论中您说“utf-8”是正确的,所以我对这个示例进行了更改。我在这里指定 end='' 是因为文件中的输入行末尾已经有一个换行符,所以我们不需要 print() 来提供另一个换行符。

    编辑:我在这里找到了关于默认编码的简短讨论:

    http://docs.python.org/release/3.0.1/whatsnew/3.0.html

    重要的一点:“有一个依赖于平台的默认编码,在 Unixy 平台上可以使用 LANG 环境变量设置(有时也可以使用其他一些特定于平台的区域设置相关的环境变量)。在许多情况下,但不是全部,系统默认值是 UTF-8;你永远不要指望这个默认值。"

    所以,我曾认为 Python 默认为 UTF-8,但似乎并非总是如此。实际上,从您的堆栈回溯中,我认为在您的系统上使用您的 LANG 环境设置,您将“cp437”作为您的默认设置。

    所以,通过回答你的问题,我也学到了一些东西!

    附:我将上面的代码示例更改为指定 utf-8,因为这是您需要的。

    【讨论】:

    • cp437 输出:█▓▓▓▓▓▓█
    • 在这种情况下,我猜测 cp437 是不正确的。 UTF-8 是默认值,这也不正确。我不知道该告诉你什么;你需要弄清楚。
    • 实际上,仅将编码指定为 'utf-8' 有效,但不指定编码无效。很奇怪。
    猜你喜欢
    • 2012-10-26
    • 2014-12-06
    • 2014-03-05
    • 1970-01-01
    • 2011-02-13
    • 2019-05-21
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多