Python 以utf-8打开文件和非法字节

Python 以utf-8打开文件和非法字节,python,python-3.x,Python,Python 3.x,我认为我的文件可能是混合编码的,它是一个非常复杂的文件。当我打开一个更正常编码的文件时,我制作的程序工作正常。在过去的4个小时里,我对如何让它正常工作感到非常困惑。 实际上可能比4>长一点 import os os.chdir("C:\\Users\\Kingsaber\\documents\\Desktop\\coding") with open("file1.txt", "r", encoding = "utf-8") as a: line1 = a.read().splitli

我认为我的文件可能是混合编码的,它是一个非常复杂的文件。当我打开一个更正常编码的文件时,我制作的程序工作正常。在过去的4个小时里,我对如何让它正常工作感到非常困惑。 实际上可能比4>长一点

import os

os.chdir("C:\\Users\\Kingsaber\\documents\\Desktop\\coding")

with open("file1.txt", "r", encoding = "utf-8") as a:
    line1 = a.read().splitlines()
with open("file2.txt", "r", encoding = "utf-8") as b:
    line2 = b.read().splitlines()

temp3 = tuple(set(line1) - set(line2))
print(temp3)

changes = open("output.txt", "w")
temp3 = list(temp3)

with open("output.txt", 'w') as file_handler:
    for item in temp3:
        file_handler.write("{}\n".format(item))
Python抛出了错误

Traceback (most recent call last):
  File "C:\Users\Kingsaber\Documents\Desktop\diff2.py", line 11, in <module>
    line1 = a.read().splitlines()
  File "C:\Python34\lib\codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 725130-725131: invalid continuation byte`
回溯(最近一次呼叫最后一次):
文件“C:\Users\Kingsaber\Documents\Desktop\diff2.py”,第11行,在
line1=a.read().splitlines()
文件“C:\Python34\lib\codecs.py”,第313行,解码
(结果,消耗)=自身缓冲区解码(数据,自身错误,最终)
UnicodeDecodeError:“utf-8”编解码器无法解码位置725130-725131中的字节:无效的连续字节`
我们的想法是打开两个非常大的文件,其中包含大约100000行代码,并将文件1与文件2进行比较,找出唯一的行。我发现有人用一个集合来做这件事,到目前为止,在用我在记事本中创建的一个快速txt文件对它进行测试后,它工作得很好

我试图打开的文件中似乎包含无效的utf-8字节。我想先删除这些invaid字节,然后再将其传递到元组中。任何帮助都将是非常感谢的,因为我实际上已经尝试通过谷歌搜索正确的方法来做到这一点,但还没有找到或理解一个正确的解决方案。我将实际链接1个文件,以防它有帮助,因为它是非常不正常的。还有一种方法可以实际检查notepad++中无效的字节。我很想知道是什么导致了这个错误。在notepad++中以utf-8编码文件的形式查看该文件似乎可以很好地显示文本


没有办法让python忽略这些字节吗?

您的问题可以归结为

text = open("file1.txt", "r", encoding = "utf-8").read()
您可以通过更改解码器处理错误的方式来修复它。选项有“严格”(默认)、“替换”(放入)和“忽略”(跳过)。UTF-8有一个有趣的特性,它可以计算出下一个角色的起始位置,所以你不应该太放松

…而且你可以一开始就制作一套

with open("file1.txt", "r", encoding = "utf-8", errors="replace") as a:
    set1 = set(a)

“我发现有人用元组来做这件事…”-你确定这不是一个吗?另外,你能显示你得到的完整回溯吗?错误很明显:在那个位置有一个无效字节。除了读取到有问题的字节,或者尝试使用十六进制编辑器对文件进行破解和更正之外,您可以做的不多。是的,这是一个set()哈哈。我用错误更新了帖子。我看到一个十六进制编辑器了吗?没有一种方法可以忽略这些无效字节而不手动编辑它吗?“替换”错误处理程序使用
(U+FFFD)作为替换字符,而不是
。还有“代理场景”,它用未配对的代理字符U+DC80到U+DCFF替换未知字节,这对保存原始损坏的数据很有用。@dan04-有趣。我猜不应该相信ASCII版本的文档!或者您可能只是将其与
open(filename'w',encoding='ASCII',errors='replace')
的反向构造混淆了(或者不包括
字符),它实际上用ASCII
(0x3F)替换不可编码的字符。