如何用utf-8非编码字符打开文件?

时间:2017-10-17 01:54:57

标签: 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()

2 个答案:

答案 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")