如何打开带有utf-8非编码字符的文件?

Stu*_*IST 2 python encoding utf-8

我想在python中打开文本文件(.dat),并且收到以下错误:'utf-8'编解码器无法解码位置4484的字节0x92:无效的开始字节,但文件使用utf-8编码,因此也许有一些无法读取的字符。我想知道,有没有一种方法可以解决这个问题而无需调用每个奇怪的字符?原因我有一个相当大的文本文件,要查找未编码的Utf-8编码字符会花费我几个小时。

这是我的代码

import codecs
f = codecs.open('compounds.dat', encoding='utf-8')
for line in f:
    if "InChI=1S/C11H8O3/c1-6-5-9(13)10-7(11(6)14)3-2-4-8(10)12/h2-5" in line:
        print(line)
searchfile.close()
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 5

查找坏字节不应该“花费您数小时”。该错误告诉您确切的位置。它在您输入的索引4484中,值为0x92;如果您这样做:

with open('compounds.dat', 'rb') as f:
    data = f.read()
Run Code Online (Sandbox Code Playgroud)

无效字节将位于data[4484],您可以根据自己的意愿进行切片以弄清楚周围的情况。

无论如何,如果您只想忽略或替换无效的字节,那么这就是该errors参数的作用。使用io.open(因为codecs.open在许多方面io.open都被巧妙地破坏了,并且更快,更正确):

# If this is Py3, you don't even need the import, just use plain open which is
# an alias for io.open
import io

with io.open('compounds.dat', encoding='utf-8', errors='ignore') as f:
    for line in f:
        if u"InChI=1S/C11H8O3/c1-6-5-9(13)10-7(11(6)14)3-2-4-8(10)12/h2-5" in line:
            print(line)
Run Code Online (Sandbox Code Playgroud)

只会忽略无效字节(丢弃它们就好像它们根本不存在一样)。您还可errors='replace'以为每个垃圾字节插入一个替换字符,因此您不会默默地删除数据。