Python 为什么在处理纯文本文件时会发生单字节损坏?

Python 为什么在处理纯文本文件时会发生单字节损坏?,python,file,byte,text-files,corruption,Python,File,Byte,Text Files,Corruption,我在这里真的很困惑,我甚至不能更清楚地说明问题的主题。在处理纯文本文件时,我遇到了一个奇怪的符号(字节)替换 例如,我有一个大约有20000个字符串的文件,其中一个是: MieptlirvgeafyitthlaptrhTvVvlvrgnfakVvrisythnchycyrtprageqvptghekdgaklrmfceqhrlsylpqilidllqgetslwqaggnfLqvelvddGepptkieynvillKpegdqimirvetaypediedKpfrfrkksYkvsrilaak

我在这里真的很困惑,我甚至不能更清楚地说明问题的主题。在处理纯文本文件时,我遇到了一个奇怪的符号(字节)替换

例如,我有一个大约有20000个字符串的文件,其中一个是: MieptlirvgeafyitthlaptrhTvVvlvrgnfakVvrisythnchycyrtprageqvptghekdgaklrmfceqhrlsylpqilidllqgetslwqaggnfLqvelvddGepptkieynvillKpegdqimirvetaypediedKpfrfrkksYkvsrilaakwedhrepkKk

我将大约1000个这样的文件合并在一起,只是使用Python(使用简单的open(filename)方法)一个接一个地编写它们。在我看到的相应字符串的结果文件中(而所有其他字符串都很好): Mieptlirvgeafydithlaptrhtvpvvlvrgnfakvrisythnchycyrtprageqvptgheikdgaklrmfceqhrlsylpqilidllqgetslwqagngnflqvelvddgepptkieynvilerkpegdqhimimirvetaetypedieydkpfrkks


因此,将“Y”(十六进制59)替换为“Щ”字母(十六进制D9)(上面两个字母都用粗体表示)。如果我再做一次这个过程,在这个地方不会发生替换,因此它是随机的(?)。我还注意到,在另一种情况下,“P”(十六进制50)和俄语“П”字母(十六进制D0)也发生了同样的替换。将这些情况联系在一起的是,如果我们从ASCII表的0和128位置计数,两种情况下成对的字母都有相同的数字:英语P的位置为80,俄语P的位置为128+80=208;字母Y的位置为89,字母“Щ”的位置为128+89=217。我猜这是一种文件损坏,但它是如何发生的,为什么会发生?有什么想法吗?

我应该在问之前就猜到了:实际上,它看起来像是一个单位翻转,可能是随机发生的读/写磁盘错误。如果对字母进行编码的字节中的第一位发生翻转,则替换内容将变为可见,因为字母不再位于ASCII表的前128个符号中,并且一些软件会对此感到不安

"Y" = 01011001
"Щ" = 11011001 

"P" = 01010000 
"Р" = 11010000

请提供预期的(MRE)。我们应该能够复制和粘贴一个连续的代码块,执行该文件,并再现您的问题以及跟踪问题点的输出。这使我们可以根据您的测试数据和所需输出测试我们的建议。请从中重复和。要求我们在一个未指定的过程中推测一个翻转的位。。。这是离题的。虽然从理论上讲,计算机可能会产生这样的随机错误,但这是极不可能的。除非你的电脑有硬件问题,否则你永远不会遇到它,当然不会多次遇到。使用
open(filename)
你可以在文本模式下打开它,它可以转换一些类似字符的新行,这些行在不同的系统上可能有不同的代码。它可能尝试将其读取为
utf-8
,但您可能有不同编码的文件。若您只想连接文件,那个么最好在字节模式下打开(文件名,“rb”)——但若您有不同编码的文件,那个么它并不能帮助您。文本文件通常没有使用什么编码的信息,你必须猜测。Prune,很抱歉,特定的数据集不会有帮助,因为正如我所写的,这种情况不经常发生(在一个大约3Gb大小的文件中,我注意到两个这样的翻转)。我花了几个小时试图弄清楚这里到底发生了什么,这是Python问题还是文件系统错误或其他什么。。。