将一系列位传递给文件python

时间:2017-01-15 22:18:07

标签: python string file

作为更大项目的一部分,我想在文件中保存一系列位,以便文件尽可能小。我不是在谈论压缩,我想保存序列,但使用最少量的字符。最初的想法是使用ASCII编码将8位的迷你序列转换为字符并保存这些字符,但由于奇怪字符的某些未知问题,读取文件时检索到的字符与最初编写的字符不同。我试过用utf-8编码打开文件,latin-1但似乎没有用。我想知道是否还有其他方法,可能是将序列转换为十六进制数字?

1 个答案:

答案 0 :(得分:0)

从技术上讲,你不能写一个字节,因为os以字节组织内存(write individual bits to a file in python),所以这是二进制文件io ,参见https://docs.python.org/2/library/io.html有模块比如struct

使用'b'开关打开文件,指示二进制读/写操作,然后使用to_bytes()函数(Writing bits to a binary file)或struct.pack()({{3} })

  with open('somefile.bin', 'wb') as f:

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

>>> bits = "10111111111111111011110"
>>> int(bits[::-1], 2).to_bytes(4, 'little')
b'\xfd\xff=\x00'

如果你想绕过内存的8位(字节)结构,可以使用位操作 bitmasks BitArrays 请参阅How to write individual bits to a text file in python?https://wiki.python.org/moin/BitManipulation

然而问题是,如你所说,如果你使用不同长度的BitArrays 来读回数据,即存储小数7,你需要3位0x111来存储小数2你需要2位0x10。现在的问题是要读回来。 你的程序如何知道它是否必须将值作为3位值或2位值读回?在无组织的存储器中,序列十进制72看起来像11110转换为{ {1}} 你的程序如何知道111|10的位置?

正常字节有序存储器中的

小数72是| - > 0000011100000010这样做的好处是00000111|00000010

的位置很明显

这就是为什么最低级别的内存被组织成8位= 1字节的固定簇。如果要访问字节/ 8位簇内的单个位,可以将位掩码与逻辑运算符https://wiki.python.org/moin/BitArrays)结合使用。在python中,单位操作最简单的方法是模块|

如果你知道你的价值都是6位也许值得付出努力,但这也很难......

http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/

How do you set, clear, and toggle a single bit?