【问题标题】:Python reading a file into unicode stringsPython 将文件读入 unicode 字符串
【发布时间】:2016-07-20 18:29:04
【问题描述】:

我在理解 Python 中处理 unicode 字符串的正确方法时遇到了一些麻烦。我已经阅读了很多关于它的问题,但仍然不清楚在读取和写入文件时应该如何避免出现问题。

我的目标是高效地逐行读取一些巨大的(最多 7GB)文件。我是用简单的with open(filename) as f: 做的,但结果是 ASCII 解码出错。

然后我读到正确的做法是写:

with codecs.open(filename, 'r', encoding='utf-8') as logfile:

然而这最终是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x88 in position 13: invalid start byte

坦率地说,我不明白为什么会引发此异常。

我找到了一个可行的解决方案:

with open(filename) as f:
    for line in logfile:
        line = unicode(line, errors='ignore')

但这种方法最终变得异常缓慢。 因此我的问题是:

有没有正确的方法,最快的方法是什么? 谢谢

【问题讨论】:

  • 您是否 100% 确定您的文件是 UTF-8 编码的?您的错误表明您的文件至少已损坏。
  • 顺便说一句,不要使用codecs.open();请改用更新且更强大的io.open()。您可以为该调用指定 errors 处理程序。
  • @MartijnPieters 不,我不是 100% 确定它是 utf-8 编码的。看起来很奇怪的是,我可以在不考虑 utf-8 的情况下定期打开它。如果它被损坏,open(filename) 也不应该引发异常吗?如果没有,因此我不得不采用unicode() 方法,有没有办法让它更快?
  • 不,只有在读取数据时才会进行解码,如果可以预先解码,则打开文件不会测试文件中的所有数据。
  • 最后,您正在 Python 中将 7GB 的数据处理为丰富的 Unicode 对象。预计会有一些缓慢无论如何

标签: python string file unicode


【解决方案1】:

您的数据可能不是 UTF-8 编码的。找出正确的编码并改用它。我们无法告诉您哪种编解码器是正确的,因为我们看不到您的数据。

如果您必须指定错误处理程序,您也可以在打开文件时这样做。使用io.open() functioncodecs 是一个较旧的库,存在一些问题,io(它支持 Python 3 中的所有 I/O 并向后移植到 Python 2)更加健壮和通用。

io.open() 函数也采用 errors

import io

with io.open(filename, 'r', encoding='utf-8', errors='replace') as logfile:

我选择replace 作为错误处理程序,因此您至少可以为任何无法解码的内容提供占位符。

【讨论】:

  • 谢谢。此解决方案有效,并且比unicode() 方法稍快。它仍然比普通的非 unicode 方法慢得多,但也许没有办法达到相当的速度。
  • @ClonedOne:根据您处理这些行的方式以及实际使用的编解码器,您可能只是将数据视为二进制而不解码。
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 2023-03-20
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
相关资源
最近更新 更多