Mac上的Python UnicodeDecodeError,但不在PC上?

时间:2015-10-14 01:02:12

标签: python macos unicode

我有一个脚本,基本上将学生的代码文件聚合到一个文件中进行剽窃检测。它遍历文件树,将所有文件内容复制到一个文件中。

我在Mac和PC上的完全相同的文件上运行脚本。在我的电脑上,它工作正常。在我的Mac上,遇到27个UnicodeDecodeErrors(可能是我正在测试的所有文件的0.1%)。

什么可能导致Mac上的UnicodeDecodeError,但不会导致PC?

如果相关,代码为:

originalFile = open(originalFilename, "r")
newFile = open(newFilename, "a")
newFile.write(originalFile.read())

3 个答案:

答案 0 :(得分:3)

找出保存该文件时使用的编码。安全的赌注是将文件加载为'utf-8'。如果成功,则可能是正确的编码。

# try utf-8. If this fails, all bets are off.
open(originalFilename, "r", encoding="utf-8")

现在,如果学生向您发送这些文件,他们可能只是在他们的系统上使用默认编码。无法可靠地猜测编码。如果他们使用8位编解码器,就像ISO-8859字符集之一那样,几乎不可能猜出使用了哪一个。那么该怎么做取决于你正在处理的文件类型。

答案 1 :(得分:1)

在Python 3上使用open()读取Python源文件是不正确的。locale.getpreferredencoding(False)默认情况下使用UnicodeDecodeError。 Python源可以使用不同的字符编码;在最好的情况下,它可能会导致# -*- coding: ... - 通常,您只是默默地获得mojibake

要考虑编码声明(locale.getpreferredencoding(False))来阅读Python源代码,请使用tokenize.open(filename)。如果失败了;输入不是有效的Python 3源代码。

  

什么可能导致Mac上的UnicodeDecodeError,但不会导致PC?

在Mac上,

'rb'很可能是utf-8。 utf-8不接受任意字节序列作为utf-8编码文本。 PC可能会使用8位字符编码来破坏输入并静默生成mojibake,而不是由于字符编码不匹配而引发错误。

要读取文本文件,您应该知道它的字符编码。如果您不知道字符编码,则将文件作为字节序列(chardet模式)读取,或者您可以尝试使用{{1}} 猜测编码Python模块(这只是一个猜测,但根据你的任务可能会很好)。

答案 2 :(得分:0)

我遇到了完全相同的问题。文件中似乎有些字符在readlines()期间给出了UnicodeDecodeError 这只发生在我的Macbook上,而没有发生在PC上。

我只需跳过以下字符即可解决问题:

with open(file_to_extract, errors='ignore') as f: reader = f.readlines()