Python UnicodeDecodeError在Mac上,而不是在PC上?

Python UnicodeDecodeError在Mac上,而不是在PC上?,python,macos,unicode,Python,Macos,Unicode,我有一个脚本,基本上将学生的代码文件聚合到一个文件中,用于检测剽窃。它遍历文件树,将所有文件内容复制到一个文件中 我已经在Mac和PC上的完全相同的文件上运行了脚本。在我的PC上,它工作正常。在我的Mac上,它遇到了27个UnicodeDecodeErrors(可能是我正在测试的所有文件的0.1%) 什么会导致Mac电脑上的UnicodeDecodeError,而不是PC上的 如果相关,代码为: originalFile = open(originalFilename, "r") newFile

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

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

什么会导致Mac电脑上的UnicodeDecodeError,而不是PC上的

如果相关,代码为:

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

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

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

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

在Python 3上使用
open(originalFilename,“r”)
读取Python源文件是不正确的<默认情况下,code>open()使用
locale.getpreferredencoding(False)
。Python源代码可以使用不同的字符编码;在最好的情况下,它可能会导致UnicodeDecodeError——通常,您只会得到一个静默的提示

要在阅读Python源代码时考虑编码声明(
-*-coding:…
),请使用。如果失败了,;输入不是有效的Python 3源代码

什么会导致Mac电脑上的UnicodeDecodeError,而不是PC上的

locale.getpreferredencoding(False)
在Mac上可能是utf-8。utf-8不接受任意字节序列作为utf-8编码文本。PC可能会使用8位字符编码,该编码会破坏输入并无声地生成mojibake,而不是由于字符编码不匹配而引发错误

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

要读取文本文件,您应该知道其字符编码。如果您不知道字符编码,则可以将文件作为字节序列读取(
'rb'
模式),或者可以尝试使用
chardet
Python模块猜测编码(这只是猜测,但可能足够好,具体取决于您的任务)。

我遇到了完全相同的问题。文件中似乎有一些字符在readlines()期间导致UnicodeDecodeError 这只发生在我的macbook上,而不是PC上

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


以f:reader=f.readlines()的形式打开(文件提取,错误='ignore')

Python版本?我们能看到在Mac上出现故障的文件吗?您可能会读到一些基本原因,说明为什么会出现
UnicodeDecodeError
@cdonts Python 3.4。不幸的是,我无法共享这些文件(学生隐私),尽管我可能能够在一个地方找到它失败的确切字符,但在另一个地方却找不到…@cdonts Python 3.4。不幸的是,我无法共享这些文件(学生隐私),尽管我可能能够在一个地方找到它失败的确切字符,但在另一个地方却找不到…这将非常有用!不过,我并不只是想阅读Python源代码文件。我正在尝试读取任何纯文本文件。如果OP不知道编码,则
'iso-8859-1'
将不正确
'iso-8859-1'
不会对任何字节序列产生错误,例如,如果您的输入是utf-8编码的
'œ'
字符,则
'iso-8859-1'
自动生成
'Å'
mojibake。@J.F.Sebastian是的,这是任何
iso-8859-*
编解码器的问题。最安全的方法是显式使用ASCII编解码器,因此始终会出现错误。我会补充一些澄清。