当unicode与二进制混合时,python编解码器readline失败

时间:2016-01-22 01:46:28

标签: python unicode utf-8 readline python-unicode

[python 3.4] 有一个混合了日语和二进制文件的UTF-8文件。 我尝试用以下代码读取行:

line = None
linecount = 0
with codecs.open(destfile, 'r', 'utf-8') as fd:
    while True:
        try:
            line = fd.readline()
            linecount += 1
        except UnicodeDecodeError:
            continue

        if not line:
            break;

    print(linecount)

尝试忽略具有二进制代码的行,但它会停止与二进制代码一致。

如何正确读取文件,忽略二进制代码行

1 个答案:

答案 0 :(得分:0)

readline读取更大的块,解码和缓冲区。如果你遇到一个无效的utf-8字符,你将在该无效块中丢失多行。为了使事情变得复杂,即使您认为某些数据是二进制的,它可能看起来像有效的utf-8并且无错误地解码。此外,实际上还没有像二进制线那样的东西。因为行只是由0A字节或0D0A序列分隔的字节序列。但这些都是二进制数字,所以说它们意味着终止一条线而不是仅仅是二进制数据的一部分。

考虑到这一点,你可以在新线上解决问题后进一步解码:

line = None
linecount = 0

for line in open(destfile, 'rb'):
    try:
        line = line.decode('utf-8')
        linecount += 1
    except UnicodeDecodeError:
        pass
print(linecount)