【问题标题】:Can't read a line in a file: UnicodeDecodeError无法读取文件中的一行:UnicodeDecodeError
【发布时间】:2019-09-29 04:47:35
【问题描述】:

我正在从文本文件中读取行。这些行有两个字段,由特殊字符 <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从大文件中读取时,最后一行是parses is 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

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

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不会停在这一行?

编辑:

请注意,我有来自不同来源的记录,即它们不遵循我所知道的特定编码。有什么通用的东西可以解决这个问题吗?

编辑: 根据一条评论,我尝试了以下方法。光标在... 之后挂起,直到我按下回车键。

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"

【问题讨论】:

  • @snakecharmerb 更改编码后,它工作但在后面的行停止,其中包含类似:'جرÙx8aدة اÙx84Ùx85Ùx88جز
  • 如果您不知道编码,为什么要以文本开头读取文件?内容对您没有意义。如果您只关心数据,请将它们作为字节读取。
  • 我可以将它们读取为 ASCII 并忽略任何错误吗?
  • 这是来自各种来源的数据,供进一步分析。我只是需要现在阅读它们以便稍后将它们插入数据库。

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


【解决方案1】:

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

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

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

但正如我之前所说,您可能无法获得最初预期的文本。

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

import codecs
help(codecs.Codec)

但如果编码错误,它们都不会按预期为您提供文本。

关于不丢失数据的问题,如果您不知道原始编码,则您已经丢失了数据。不仅无法读取的行是有问题的。即使该行可以正确读取,您也无法判断您读取的字符是否与原始文本中的字符相同,除非行仅包含 ASCII 字符。

【讨论】:

  • 谢谢。我不能更改数据中的任何内容。我更喜欢完全跳过有问题的行。尝试/排除似乎是正确的做法吗?
  • 但是把它们放在哪里呢?这些错误是在open 中生成的吗?还是在split 函数中?
  • AttributeError: 模块 'codecs' 没有属性 'Codecs'
  • 会尝试/排除帮助吗?
  • 您能否澄清一下:使用errors="ignore" 会导致丢失一些无法读取的数据吗?还是会改变什么?另外,请向我澄清。 try/except 会解决问题吗?
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2018-12-26
  • 2020-10-07
  • 2020-09-27
  • 2020-09-23
相关资源
最近更新 更多