调用readline()时,文件打开过滤器显然被忽略

时间:2013-01-22 18:27:24

标签: python python-3.x readline flags

我正在运行以下代码:

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源代码来处理使用脚本,因此非常感谢任何有助于实现此设置的帮助。

1 个答案:

答案 0 :(得分:2)

您的问题不在于阅读文件,而在于打印;回溯显示行print(line)UnicodeEncodeError之前(请注意该异常中的编码)。当您读取文件时,您正在从cp1252到unicode对象进行解码,这样就可以了。

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

您可以使用chcp 65001命令切换终端代码页(不是Python表达式,而是Windows命令行工具)。代码页65001是UTF-8代码页,可以处理所有Unicode代码点。您可能需要切换字体才能显示这些字符。见Unicode characters in Windows command line - how?