假设我有一个像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()
答案 0 :(得分:10)
struct模块就是您想要的。从您的示例中,824 = 0000001100111000二进制或0338十六进制。这是两个字节03H和38H。 struct.pack将824转换为这两个字节的字符串,但你还必须决定little-endian(先写38H)或big-endian(先写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
答案 1 :(得分:5)
查看struct:
>>> struct.pack("h", 824)
'8\x03'
答案 2 :(得分:2)
我认为你想要的是open
二进制模式下的文件:
open("file.bla", "wb")
但是,这会向文件写一个整数,大小可能是4个字节。我不知道Python是否有2字节整数类型。但是你可以通过在一个32位数字中编码2个16位数来避免这种情况:
a = 824
b = 1234
c = (a << 16) + b