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

Pro*_*mer 7 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()
Run Code Online (Sandbox Code Playgroud)

Mar*_*nen 10

结构模块是你想要的.从您的示例中,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'
Run Code Online (Sandbox Code Playgroud)

struct返回一个双字节字符串.'\ x ##'表示法表示(具有十六进制值##的字节).'8'是ASCII'8'(值38H).Python字节字符串使用ASCII表示可打印字符,使用\ x ##表示法表示不可打印字符.

下面是将二进制数据写入和读取到文件的示例.在写入和读取二进制文件时,应始终指定endian-ness,以防在具有不同endian默认值的系统上读取它:

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))
Run Code Online (Sandbox Code Playgroud)

产量

bin_data length: 2
Value from file: 824
bin_data representation: '8\x03'
Byte 0 as binary: 00111000
Byte 1 as binary: 00000011
Run Code Online (Sandbox Code Playgroud)


Jor*_*ril 5

看看struct:

>>> struct.pack("h", 824)
'8\x03'
Run Code Online (Sandbox Code Playgroud)


Bjö*_*lex 2

我认为你想要的是open二进制模式的文件:

open("file.bla", "wb")
Run Code Online (Sandbox Code Playgroud)

但是,这会将一个整数写入文件,其大小可能为 4 个字节。我不知道Python是否有2字节整数类型。但是你可以通过将 2 个 16 位数字编码为一个 32 位数字来规避这一点:

a = 824
b = 1234
c = (a << 16) + b
Run Code Online (Sandbox Code Playgroud)