首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打开包含utf-8非编码字符的文件?

如何打开包含utf-8非编码字符的文件?
EN

Stack Overflow用户
提问于 2017-10-17 09:54:57
回答 2查看 18.8K关注 0票数 4

我想在python中打开一个文本文件(.dat),我得到了以下错误:' utf-8‘编解码器无法解码位置4484处的字节0x92 :无效的起始字节,但该文件是使用utf-8编码的,因此可能有一些字符无法读取。我想知道,有没有办法处理这个问题,而不是调用每个奇怪的字符?因为我有一个相当大的文本文件,我需要几个小时才能找到未编码的Utf-8编码字符。

以下是我的代码

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-17 10:30:36

它不应该“花你几个小时”来找到坏字节。该错误准确地告诉您它的位置;它在您的输入中值为0x92的索引4484处;如果您这样做了:

代码语言:javascript
复制
with open('compounds.dat', 'rb') as f:
    data = f.read()

无效字节将位于data[4484],您可以根据自己的喜好对其进行切片,以找出它周围的内容。

在任何情况下,如果您只想忽略或替换无效字节,这就是errors参数的作用。Using io.open (因为codecs.open在许多方面都被巧妙地破坏了,而io.open更快也更正确):

代码语言:javascript
复制
# 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'为每个垃圾字节插入一个替换字符,这样就不会静默地丢弃数据。

票数 7
EN

Stack Overflow用户

发布于 2019-07-25 15:01:35

如果要处理大量数据,最好默认使用编码,如果错误仍然存在,也可以使用errors="ignore“

代码语言:javascript
复制
with open("filename" , 'r'  , encoding="utf-8",errors="ignore") as f:
    f.read()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46781371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档