我想在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()
答案 0 :(得分:4)
找不到坏字节不应该“花费你几个小时”。该错误告诉您完全它在哪里;它在输入中的索引4484处,值为0x92
;如果你这样做:
with open('compounds.dat', 'rb') as f:
data = f.read()
无效字节位于data[4484]
,您可以根据需要进行切片以找出其周围的内容。
无论如何,如果您只想忽略或替换无效字节,那就是errors
参数的用途。 Using 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)
将忽略无效字节(将它们丢弃,就好像它们从未存在过一样)。您还可以传递errors='replace'
为每个垃圾字节插入替换字符,因此您不会以静默方式丢弃数据。
答案 1 :(得分:0)
如果处理海量数据,最好使用编码作为默认值,如果错误仍然存在,则也应使用errors =“ ignore”
代码段:
with open("filename" , 'r' , encoding="utf-8",errors="ignore")