2012-04-18 57 views
1

这里是我的代码:的Python:从文件显示错误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的记事本和IDLE中编辑file.txt。该文件是ASCII/ANSI。顺便说一句,我使用的是Python 3。 3.3 alpha-win-64如果它很重要。

回答

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”。

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

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

+0

CP437输出该: █▓▓▓▓▓▓█<---印刷 干草干草,球员 asdfΓûôΓûôΓûô Γûê Γûê< - 从文件打印。 – SuperDisk 2012-04-18 21:36:31

+1

在这种情况下,我会猜测cp437是不正确的。 UTF-8是默认的,这也是不正确的。我不知道该告诉你什么;你需要弄明白。 – steveha 2012-04-18 21:38:12

+0

实际上,只是将编码指定为'utf-8',但不指定编码。奇怪的。 – SuperDisk 2012-04-18 21:46:14

0

尝试使该字符串的Unicode:

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

他正在使用Python 3.x,它不再具有'u“''语法。所有字符串都是Python 3.x中的Unicode。 – steveha 2012-04-18 21:01:04

+0

这不是造成它的原因。打印本身工作正常,从文件打印是导致错误的原因。这也是python 3. – SuperDisk 2012-04-18 21:01:16

+0

读取文件为二进制'open('..','rb')'help? – Blender 2012-04-18 21:02:29