1

这是我的代码:

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 如果重要的话。

4

2 回答 2

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”作为您的默认设置。

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

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

于 2012-04-18T21:06:38.060 回答
0

尝试将该字符串设为 unicode:

print(u"█████")
      ^ Add this
于 2012-04-18T21:00:16.400 回答