【问题标题】:How to open a file with utf-8 non encoded characters?如何打开带有 utf-8 非编码字符的文件?
【发布时间】:2017-10-17 01:54:56
【问题描述】:

我想在 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()

【问题讨论】:

  • 是的,但我认为它只是文件中遇到的第一个非编码 UTF-8 字符,因此我假设一旦我更正了那个字符,我会遇到另一个和另一个,然后很快。正如我在问题中指定的那样,我要阅读的文本文件相当大
  • 旁注:如果您使用 Python 2.6 或更高版本,带有标准(字节->文本)编解码器,请不要使用 codecs.open,使用 io.open,这样更快,并且比codecs.open 少错误。 io.open 实际上与 Python 3 上的内置 open 相同,但在 Python 2 上可用以简化编写 Unicode 友好代码并简化到 Py3 的移植。
  • 在我看来“utf-8 非编码字符”是oxymoron。要成为 utf-8,它的内容需要以这种方式编码。也许是'latin1'
  • 使用 UTF-8 编码的文件不能包含无效字节,除非它被损坏,或者编码器有问题。我想这些事情中的任何一个都是可能的,但更有可能的是该文件实际上并未编码为 UTF-8,而是其他的东西,例如 cp1252。是什么让您确定它是 UTF-8?
  • FWIW,在cp1252中0x92是撇号的编码

标签: python encoding utf-8


【解决方案1】:

找到坏字节不应该“花费你几个小时”。该错误会告诉您确切它在哪里;它位于您输入的索引 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' 为每个垃圾字节插入一个替换字符,这样您就不会静默删除数据。

【讨论】:

    【解决方案2】:

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

    with open("filename" , 'r'  , encoding="utf-8",errors="ignore") as f:
        f.read()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-19
      • 2011-02-21
      • 2017-09-04
      • 2022-07-20
      • 2011-12-04
      • 2018-04-30
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多