UnicodeDecodeError:数据意外结束

UnicodeDecodeError:数据意外结束,unicode,python-3.x,Unicode,Python 3.x,我有一个巨大的文本文件要打开。 我将文件分块读取,避免了与一次读取过多文件相关的内存问题 代码片段: def open_delimited(fileName, args): with open(fileName, args, encoding="UTF16") as infile: chunksize = 10000 remainder = '' for chunk in iter(lambda: infile.read(chunksiz

我有一个巨大的文本文件要打开。
我将文件分块读取,避免了与一次读取过多文件相关的内存问题

代码片段:

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”编解码器无法解码8190-8191位置的字节:数据意外结束

我尝试了
UTF8
,但出现了错误
UnicodeDecodeError:“UTF8”编解码器无法解码位置0中的字节0xff:无效的起始字节

latin-1
iso-8859-1
引发了错误
indexer:列表索引超出范围

输入文件的示例:

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
适用于其中的许多文件,但在特定文件中失败

是否仍要解决此问题?

若要忽略损坏的数据(可能导致数据丢失),请在
open()
调用上设置
errors='ignore'

with open(fileName, args, encoding="UTF16", errors='ignore') as infile:
各国:

  • “忽略”
    忽略错误。请注意,忽略编码错误可能会导致数据丢失
这并不意味着您可以从明显的数据损坏中恢复

为了举例说明,假设在文件中的某个位置删除或添加了一个字节。UTF-16是一种编解码器,每个字符使用2个字节。如果有一个字节丢失或多余,那么丢失或多余字节后面的所有字节对都将不对齐


这可能会导致进一步的解码问题,不一定是立即的。UTF-16中有一些代码点是非法的,但通常是因为它们与另一个字节对结合使用;针对这样一个无效的代码点引发了您的异常。但在该点之前可能有数百或数千个字节对是有效的UTF-16,如果不是易读的文本。

我也在做同样的事情(读取大量大块的大型文本文件),并在其中一个文件中遇到了相同的错误:

Traceback (most recent call last):
  File "wordcount.py", line 128, in <module>
    decodedtext = rawtext.decode('utf8')
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc2 in position 9999999: unexpected end of data

这还解决了更普遍的问题,即当单词跨越两个块时,它们会被切成两半。

在Python3中,如果您的输入文件是UTF-16(尽管被截断),当您读/写
io.StringIO
对象而不是
io.BytesIO时,也会发生这种情况,那么Latin1或UTF-8肯定不起作用。我们能看看您输入文件的样本吗?那么至少我们可以试着猜一下所使用的编码。以二进制形式读取文件,然后打印出来<代码>打印(open(fileName,'rb').read(120))
应该给我们足够的时间来处理。@MartijnPieters我添加了一个输入文件的示例。这绝对是UTF16。如果数据在某个地方被破坏,我们几乎无法修复。您可以尝试不同的块大小,可能是
TextIOWrapper.read()
中有一个错误,它以代理项对的部分读取结束。我建议使用2的幂<例如,code>16384是2**14。在任何情况下,尝试使用任何其他编解码器都是行不通的。我尝试了
errors='ignore'
并获得
Requires='{}{}。format(*pieces[-1])Indexer:list index超出范围re.findall()
不返回任何匹配项。这是忽略无效字符的风险;如果文件中缺少一个字节,那么UTF-16解码现在可能无法读取;在这种情况下,实际上无法检测到丢失了什么字节,您看到的异常可能已经远远超过了文件损坏。
# read text
rawtext = file.read(chunksize)

# fix splited end
if chunknumber < totalchunks:
    while rawtext[-1] != ' ':
        rawtext = rawtext + file.read(1)

# decode text
decodedtext = rawtext.decode('utf8')