【发布时间】:2013-08-23 20:09:10
【问题描述】:
我有一个巨大的文本文件要打开。
我正在分块读取文件,避免与一次读取太多文件相关的内存问题。
代码 sn-p:
def open_delimited(fileName, args):
with open(fileName, args, encoding="UTF16") as infile:
chunksize = 10000
remainder = ''
for chunk in iter(lambda: infile.read(chunksize), ''):
pieces = re.findall(r"(\d+)\s+(\d+_\d+)", remainder + chunk)
for piece in pieces[:-1]:
yield piece
remainder = '{} {} '.format(*pieces[-1])
if remainder:
yield remainder
代码抛出错误UnicodeDecodeError: 'utf16' codec can't decode bytes in position 8190-8191: unexpected end of data。
我尝试了UTF8 并得到了错误UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte。
latin-1 和iso-8859-1 引发错误IndexError: list index out of range
输入文件示例:
b'\xff\xfe1\x000\x000\x005\x009\x00\t\x001\x000\x000\x005\x009\x00_\x009\x007\x004\x007\x001\x007\x005\x003\x001\x000\x009\x001\x00\t\x00\t\x00P\x00o\x00s\x00t\x00\t\x001\x00\t\x00H\x00a\x00p\x00p\x00y\x00 \x00B\x00i\x00r\x00t\x00h\x00d\x00a\x00y\x00\t\x002\x000\x001\x001\x00-\x000\x008\x00-\x002\x004\x00 \x00'
我还要提到我有几个这样的大文本文件。UTF16 对其中许多文件都适用,但在特定文件上却失败了。
有办法解决这个问题吗?
【问题讨论】:
-
如果您的输入文件是 UTF-16(尽管被截断),那么Latin1 或UTF-8 肯定不起作用。
-
我们可以看看你的输入文件的样本吗?然后至少我们可以尝试猜测使用的编码。将文件读取为二进制文件,然后打印出来。
print(open(fileName, 'rb').read(120))应该足够我们合作了。 -
@MartijnPieters 我添加了输入文件的示例。
-
那绝对是 UTF16。如果该数据在某处损坏,我们几乎无法修复它。您可以尝试不同的块大小,也许
TextIOWrapper.read()中有一个错误,它最终会部分读取代理对。我推荐 2 的幂。例如,16384是 2**14。 -
无论如何,尝试使用任何其他编解码器都行不通。
标签: unicode python-3.x