【发布时间】:2018-02-11 02:19:06
【问题描述】:
我编写了最简单的 python 程序,它显示了我需要帮助的错误。
lines_read = 0
urllist_file = open('../fall11_urls.txt', 'r')
for line in urllist_file:
lines_read += 1
print('line count:', lines_read)
我在大多数文件上运行它,当然它可以按预期工作,但“fall11_urls.txt”是一个包含 URL 的 1400 万行文本文件,每行一个。其中一些行包含带有明显非 utf-8 字符的文本,我得到下面引用的错误。我需要访问这些 URL 中的每一个 处理此问题的最佳方法是什么。这些 URL 可以是“任何东西”,有些是 400 个随机字符,如“https://bbswigr.fty.com/_Kcsnuk4J71A/RjzGhXZGmfI/AAAARg/xP3FO-Xbt68/s320/Axolo.jpg”中的一些字符串包含诸如 0x96 之类的字符,我需要我的 python 程序对文件中可能存在的任何内容都具有鲁棒性。(如果这很重要在 Ubuntu 16.04 上运行)
这是错误
Traceback (most recent call last):
File "./count_lines.py", line 2, in <module>
for line in urllist_file:
File "/home/chris/.virtualenvs/cvml3/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 5529: invalid start byte
更多信息 iconv 发现同一个文件存在同样的问题。见下文
$ iconv ../fall11_urls.txt >> /dev/null
iconv: illegal input sequence at position 1042953625
我目前的工作是丑陋的。我使用 iconv 来查找问题,然后我在 vi 中手动编辑文件,然后处理它。并继续这样做,直到它干净但我在许多文件中有数百万行要处理。在我手动更正它们之后,这些 URL 大部分都可以正常工作,因此这些不是噪音或“翻转位”。
【问题讨论】:
-
读取为二进制,然后将其解码为您需要的格式
-
IMO 最明智的方法是使用
errors='surrogateescape'。没有任何好的方法。