Python:文件中的Ascii字符显示错误

时间:2012-04-18 20:57:20

标签: python file io character-encoding ascii

这是我的代码:

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的Notepad和IDLE中编辑file.txt。该文件是ASCII / ANSI。 顺便说一下,我正在使用Python 3。 3.3 alpha win-64如果重要的话。

2 个答案:

答案 0 :(得分:2)

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

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

默认情况下,Python源文件作为UTF-8处理。我不知道你在源文件中粘贴了哪些字符,但不管它是什么,Python都将它读作UTF-8,它似乎有效。当你插入那些文本编辑器时,你的文本编辑器可能会转换为有效的UTF-8吗?

回溯表明Python将输入文件视为“Code Page 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”作为默认设置。

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

P.S。我更改了上面的代码示例以指定utf-8,因为这就是您所需要的。

答案 1 :(得分:0)

尝试将该字符串设为unicode:

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