无法读取文件中的行:UnicodeDecodeError

时间:2019-05-11 15:34:19

标签: python python-3.x file utf-8 codec

我正在从文本文件中读取行。这些行有两个由特殊字符<xx>分隔的字段。

代码:

result = open("myresult"+now.strftime("%d%m%Y-%H%M%S")+".txt","a")
inFile = open("test.txt","r")

x=1
for i in inFile:
    print("line",str(x))
    print(i)
    print(i.split("<xx>",1)[1])
    x=x+1

当python从大文件中读取内容时,解析的最后一行是line 2060,之后显示此错误:

Traceback (most recent call last):
    File "mycode.py", line 11, in <module>
      for i in inFile:   File "/usr/local/lib/python3.6/codecs.py", line 321, in decode
          (result, consumed) = self._buffer_decode(data, self.errors, final)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 3901:
        invalid continuation byte

当我从输入文件line 2061中提取test.txt时,我发现了以下字符串:

https://rrr.com<xx>{'Server': 'nginx', 'Date': 'Fri, 19 Apr 2019 06:01:30 GMT', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Set-Cookie': 'btst=1c95019e21634b953d79e9124ec8a40a|127.0.0.1|1555653690|1555653690|0|1|0; path=/; domain=.rrr.com; Expires=Thu, 15 Apr 2027 00:00:00 GMT; HttpOnly; SameSite=Lax;, snkz=127.0.0.1; path=/; Expires=Thu, 15 Apr 2027 00:00:00 GMT', 'Content-Encoding': 'gzip'}

当我尝试将其放在单独的文件中并单独解析时,没有出现错误。

有人可以向我解释什么问题吗?如何解决该问题,以便python不会在此行停止?

编辑:

请注意,我有来自各种来源的记录,即它们没有遵循我所知道的特定编码。有什么通用的解决方案吗?

编辑: 根据一条评论,我尝试了以下方法。光标会悬在...之后,直到按Enter。

Python 3.6.5 (default, Mar 15 2019, 05:40:52) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("test.txt","rb") as f: print(repr(f.read()[3890:3910]))
... 
b"sfer-Encoding': 'chu"

1 个答案:

答案 0 :(得分:1)

问题是,尽管您相信,该文件还是使用特定的编码创建的。为了有意义地解码文件,您需要使用相同的编码。否则,您将无法保证获得文件创建者想要的文本。

如果可以丢失一些数据,可以使用errors='ignore'来避免错误:

open("test.txt", "r", errors="ignore")

但是正如我之前说过的,您可能不会获得原本打算的文字。

有关errors参数的更多选项,请在python控制台中运行以下代码:

import codecs
help(codecs.Codec)

但是,如果编码错误,它们都不会像预期的那样为您提供文本。

关于不丢失数据的问题,如果您不知道原始编码,那么您已经丢失了数据。不仅不能读取的行都是有问题的。即使可以无错误地读取行,也无法分辨所读取的字符是否与原始文本中的字符相同,除了可能仅包含ASCII字符的行。