2

我正在运行以下代码:

def displayFileOld(file_path):
    f = open(file_path, mode = 'rt', encoding = 'cp1252', errors = 'replace')  
    while True:
        line = f.readline()
        if len(line) == 0:
            break
        print(line)

在 Python 3.3、Windows 8 Pro 下。

我正在“解析”的文件(Java 源文件)由 Eclipse 显示为在 Cp1252 中编码(“从主容器继承”)。Notepad++ 在编码菜单下只说“ANSI”。这两个匹配。

首先,我希望 Unicode 的编码能够......工作。但是,它失败了,并显示以下消息:

Traceback (most recent call last):
  File "C:\work\test.py", line 69, in <module>
    main()
  File "C:\work\test.py", line 65, in main
    displayFileOld(r'C:\work\CVSProvisioningFeatures.java')
  File "C:\work\test.py", line 48, in displayFileOld
    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 62-63:     character maps to <undefined>

其次,我不希望我的堆栈跟踪提到 cp437.py,而不是与我在标志中提到的编码相对应的 *.py 文件。(遇到“†”字符时解析失败,不确定 Unicode 如何不包含这个字符 - 这是上下文:'new FeatureDescription(i++,"†† "+str));')。

第三,我不确定为什么完全忽略错误标志。

我花了几个小时尝试在通用“ANSI”保护伞下托管的不同编码,但徒劳无功。我所能做的就是捕获异常并忽略该行(不可接受)。另一种方法是使用一些“异国情调”的编码,例如 MacRoman,但是在遍历整个源代码树之后,仍然会留下一些意想不到的字符(尽管我只得到 12 个错误而不是 431)......我最终需要的字符转发工作,传递大量字符串。我有大约 50 MB 的 Java 源代码可用于使用脚本,因此非常感谢任何帮助进行此设置。

4

1 回答 1

2

您的问题不在于读取文件,而在于打印;回溯显示该行在print(line)UnicodeEncodeError注意该异常中的编码)之前。当您读取文件时,您正在从 cp1252解码unicode为对象,这工作得很好。

您的 Windows 终端正在使用代码页 437,无法处理您尝试打印的字符。Python 需要将您的数据从 unicode 转换为您的终端正在使用的任何内容,以便能够向您显示字符。

chcp 65001您可以使用命令(不是 Python 表达式,而是 Windows 命令行工具)切换终端代码页。代码页 65001 是 UTF-8 代码页,它可以处理所有 Unicode 代码点。您可能还需要切换字体才能显示这些字符。请参阅Windows 命令行中的 Unicode 字符 - 如何?

于 2013-01-22T18:29:25.070 回答