2013-03-24 36 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') 

顯然是有規律的存在,並且會更有效,只是存儲指數而不是質量。