我在理解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')
但这种方法最终却非常缓慢。因此,我的问题是:
有正确的方法吗?最快的方法是什么?感谢
您的数据可能不是UTF-8编码的。找出正确的编码并使用它。我们无法告诉您什么编解码器是正确的,因为我们看不到您的数据。
如果必须指定错误处理程序,那么在打开文件时也可以这样做。使用io.open()
功能;codecs
是一个较旧的库,并且存在一些问题,即io
(它支撑着Python3中的所有I/O,并被后移植到Python2)要健壮得多,用途也要广泛得多。
io.open()
函数也采用errors
:
import io
with io.open(filename, 'r', encoding='utf-8', errors='replace') as logfile:
我选择replace
作为错误处理程序,这样您至少可以为任何无法解码的内容提供占位符字符。