我有一个脚本,基本上将学生的代码文件聚合到一个文件中进行剽窃检测。它遍历文件树,将所有文件内容复制到一个文件中。
我在Mac和PC上的完全相同的文件上运行脚本。在我的电脑上,它工作正常。在我的Mac上,遇到27个UnicodeDecodeErrors(可能是我正在测试的所有文件的0.1%)。
什么可能导致Mac上的UnicodeDecodeError,但不会导致PC?
如果相关,代码为:
originalFile = open(originalFilename, "r")
newFile = open(newFilename, "a")
newFile.write(originalFile.read())
答案 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上,什么可能导致Mac上的UnicodeDecodeError,但不会导致PC?
'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()