【问题标题】:python file open() throws exception for non utf-8 characterpython 文件 open() 为非 utf-8 字符抛出异常
【发布时间】: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'。没有任何好的方法。

标签: python file utf-8


【解决方案1】:

回答我自己的问题,让大家知道什么有效。是的,在二进制文件中打开我试过了,但是我没有“文本”文件。我阅读了编码并发现以下工作,因为每个二进制字符值都是有效的。这是最安全的做法。

urllist_file = open('../fall11_urls.txt', 'r',   encoding="latin-1")

似乎任何人打开他们从其他人那里获得的文本文件并且无法控制或提前知道里面的内容可能会被建议使用“latin-1”,因为在 Latin-1 中没有无效的字节值。

谢谢。以二进制打开的建议让我调查了 open() 接受的其他参数。我是 Python 新手,惊讶地发现字符串只是一个字节列表。 (这就是你在 C 领域工作 20 多年的条件。)

【讨论】:

  • 您可能会喜欢阅读this
【解决方案2】:

你试过骗子方法吗?这应该有效。 urllist_file = open('../fall11_urls.txt', 'rb') 然后转换成你想要的任何格式

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多