我打算使用Python将数据写入文件,该数据恰好完全由布尔值(即二进制0/1)和换行符组成。
我尝试过的是:
1)以.BIN扩展名命名文件,并在文件对象创建中使用“ wb”标志。
2)在数值上分别使用.write(bytes(0/1))
,在换行符上分别使用.write(bytes(('\n').encode()))
3)在文件中写了大约一百个0和一百个1,以及5个换行符。
最终文件大小仍然太大-当我期望200位+ 5 * 2字节(因为换行符是2字节)时,为104字节。所以总共35个字节。
发生了什么事?
将位写入文件是一个问题,因为缓冲区以字节而不是位为单位说话。因此,如果要写入位,则必须将它们组合为字节,这也可能意味着必须填充,以防位数不均。您可以自己手动编写bits2bytes和bytes2bits,或使用模块。我相信您正在寻找的模块是包含这些功能和类似功能的bitarray模块(可能需要点安装)。
请注意,由于填充的原因,通常的做法是在文件开始时也写上您使用的填充的长度。如果您不包括该值,那么您将不知道使用了多少填充。因为字节是8位,所以我们最多可以有7位填充。因此,我们需要在文件开始处留出3位空格,以了解添加了多少填充。
from bitarray import bitarray
def bits2file(filename,bits):
pad_len = 8-(len(bits)+3)%8
file_bits = bitarray(bin(pad_len)[2:].zfill(3)) + bits
f = open(filename,'wb')
file_bits.tofile(f)
f.close()
def file2bits(filename):
file_bits = bitarray()
f = open(filename,'rb')
file_bits.fromfile(f)
f.close()
pad_len = int(file_bits[:3].to01(),2)
return file_bits[3:-pad_len]
bits = bitarray('101011111')
bits2file('temp',bits)
bits = file2bits('temp')
print(bits)
bits = bitarray('10000100010100')
bits2file('temp',bits)
bits = file2bits('temp')
print(bits)