在python中按行读取二进制文件会导致unicode数据问题吗?

时间:2018-12-29 05:34:37

标签: python-3.x unicode newline filehandle

我正在python3中读取一个很大的(10Gb)bzip压缩文件,该文件是utf-8编码的JSON。不过,我只希望其中的几行以一组特定的字节开头,因此为了省去将所有行解码为unicode的麻烦,我以“ rb”模式读取文件,如下所示:

with bz2.open(filename, 'rb') as file:
    for line in file:
        if line.startswith(b'Hello'):
            #decode line here, then do stuff

但是我突然想到,如果其中一个Unicode字符包含与换行符相同的字节怎么办?通过执行for line in file,我会冒被截断的风险吗?还是二进制文件上的逐行迭代器仍然可以通过魔术起作用?

1 个答案:

答案 0 :(得分:1)

逐行迭代将适用于UTF-8编码的数据。 不是靠魔术,而是靠设计: 创建UTF-8是为了向后兼容ASCII。

ASCII仅使用0到127的字节值,对任何类型的扩展都保留可能的值的上半部分。 UTF-8充分利用了这一点,因为ASCII以外的任何Unicode代码点都使用128..255范围内的字节进行编码。

例如,字母“Ċ”(带点号的大写字母C)的Unicode代码点值为U+010A。 在UTF-8中,它使用字节序列C4 8A进行编码,因此不使用字节0A(ASCII换行符)。

相反,UTF-16编码与0A 0101 0A相同的字符(取决于字节序)。 因此,我猜想UTF-16不能进行逐行迭代。 虽然它不像文件编码那样普遍。