为了节省空间,哪种字符编码最适合只用位和换行符(0,1,'\ n')在Python中写入文件?

问题描述 投票:0回答:1

我打算使用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个字节。

发生了什么事?

python types file-io character-encoding binary
1个回答
0
投票

将位写入文件是一个问题,因为缓冲区以字节而不是位为单位说话。因此,如果要写入位,则必须将它们组合为字节,这也可能意味着必须填充,以防位数不均。您可以自己手动编写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)
© www.soinside.com 2019 - 2024. All rights reserved.