作为更大项目的一部分,我想在文件中保存一系列位,以便文件尽可能小。我不是在谈论压缩,我想保存序列,但使用最少量的字符。最初的想法是使用ASCII编码将8位的迷你序列转换为字符并保存这些字符,但由于奇怪字符的某些未知问题,读取文件时检索到的字符与最初编写的字符不同。我试过用utf-8编码打开文件,latin-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/)