如何在Python中将单个比特写入文本文件?

7 投票
3 回答
9725 浏览
提问于 2025-04-16 13:04

假设我有一个数字,比如824,我用Python把它写入一个文本文件。在这个文本文件中,它会占用3个字节的空间。不过,如果我用二进制位来表示这个数字,它的表示方式是0000001100111000,这样只需要2个字节(16位)。我在想,怎么才能在Python中把位写入文件,而不是字节。如果能做到这一点,文件的大小就会是2个字节,而不是3个字节。请提供代码。我使用的是Python 2.6,而且我不想使用任何不包含在基本安装中的外部模块。我试过下面的代码,结果却给了我12个字节!

a =824;
c=bin(a)
handle = open('try1.txt','wb')
handle.write(c)
handle.close()

3 个回答

2

我觉得你想要的是以二进制模式来open文件:

open("file.bla", "wb")

不过,这样会把一个整数写入文件,通常这个整数的大小是4个字节。我不确定Python是否有2字节的整数类型。不过你可以通过把两个16位的数字编码成一个32位的数字来解决这个问题:

a = 824
b = 1234
c = (a << 16) + b
5

看看这个struct模块:

>>> struct.pack("h", 824)
'8\x03'
10

你需要用到 struct 模块。根据你的例子,824可以表示成二进制的0000001100111000,或者十六进制的0338。这实际上是两个字节,分别是03H和38H。使用struct.pack可以把824转换成这两个字节组成的字符串,但你还需要决定是小端(先写38H)还是大端(先写03H)。

示例

>>> import struct
>>> struct.pack('>H',824) # big-endian
'\x038'
>>> struct.pack('<H',824) # little-endian
'8\x03'
>>> struct.pack('H',824)  # Use system default
'8\x03'

struct返回的是一个两个字节的字符串。'\x##'这种表示法意味着一个字节的十六进制值是##。而'8'是ASCII码中的'8'(值为38H)。Python的字节字符串对于可打印的字符使用ASCII码,对于不可打印的字符则使用\x##这种表示法。

下面是一个写入和读取二进制数据到文件的例子。在写入和读取二进制文件时,你应该始终指定字节序,以防在字节序不同的系统上读取:

import struct

a = 824
bin_data = struct.pack('<H',824)
print 'bin_data length:',len(bin_data)

with open('data.bin','wb') as f:
    f.write(bin_data)

with open('data.bin','rb') as f:
   bin_data = f.read()
   print 'Value from file:',struct.unpack('<H',bin_data)[0]

print 'bin_data representation:',repr(bin_data)
for i,c in enumerate(bin_data):
    print 'Byte {0} as binary: {1:08b}'.format(i,ord(c))

输出

bin_data length: 2
Value from file: 824
bin_data representation: '8\x03'
Byte 0 as binary: 00111000
Byte 1 as binary: 00000011

撰写回答