我正在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
,我会冒被截断的风险吗?还是二进制文件上的逐行迭代器仍然可以通过魔术起作用?
答案 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 01
或01 0A
相同的字符(取决于字节序)。
因此,我猜想UTF-16不能进行逐行迭代。
虽然它不像文件编码那样普遍。