这是我的代码:
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如果重要的话。
答案 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