如何在python中将单个位写入文本文件?

时间:2011-03-05 17:31:27

标签: python file-io

假设我有一个像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 个答案:

答案 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