2013-03-24 105 views
1

我一直试图将long int(m39 prime)作为二进制文件存储。 当我尝试将bin值写入文件时,它将被写为一个字符串。Python将long int作为二进制值写入文件

>>> m39 = bin(2**13466917-1) 
>>> open('m39', 'wb').write(m39) 
[email protected]:~/Desktop$ xxd m39 | head 
0000000: 3062 3131 3131 3131 3131 3131 3131 3131 0b11111111111111 
0000010: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000020: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000030: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000040: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000050: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000060: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000070: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 
0000080: 3131 3131 3131 3131 3131 3131 3131 3131 1111111111111111 

我感觉相当肯定,有一个可笑的简单的答案,但我还没有成功地转换成M39的ByteArray或写入缓冲区。我应该使用io还是memoryview等

非常感谢任何人可以提供任何援助。 :)

我正在使用Python 2.7.3,我更喜欢我们内置模块,如果可能的话。

编辑:我试图将值存储为一个二进制文件,将占用磁盘/内存上少得多的空间。我知道bin类型是python中的一个字符串,但我正在尝试编写\x11\x11\x11\x11 not \x31\x31\x31\x31。我的意图不是打印值的字符串表示,而是为了以后使用/操作而有效地存储它。

回答

2

根据数据的结构,您应该使用struct模块或array(即对于一组同类值,数组将更简单/更快)。

2

Python pickle模块非常高效。该表示仅比原始二进制值可存储的长度长8个字节。这个工程在Python 2.x或3.X:

import pickle 
m39 = 2**13466917-1 
with open('m39.dat','wb') as f: 
    pickle.dump(m39,f,pickle.HIGHEST_PROTOCOL) 

结果十六进制转储(1683373个字节):

80 03 8B A5 AF 19 00 FF FF FF ... FF FF FF 1F 2E 

回读:

import pickle 
with open('m39.dat','rb') as f: 
    m39 = pickle.load(f) 

Python 3里也有to_bytesfrom_bytes方法整数,但需要更多的工作,因为必须计算字节的整数长度。

import math 
m39 = 2**13466917-1 
s = m39.to_bytes(math.ceil(m39.bit_length()/8),'little') 
with open('m39.dat','wb') as f: 
    f.write(s) 

结果十六进制转储(1683365个字节):

FF FF FF FF FF FF FF FF FF FF ... FF FF FF FF 1F 

回读:

with open('m39.dat','rb') as f: 
    data = f.read() 
m39 = int.from_bytes(data,'little') 

显然是有规律的存在,并且会更有效,只是存储指数而不是质量。