簡體   English   中英

Python將long int作為二進制值寫入文件

[英]Python writing a long int as a binary value to a file

我一直在嘗試使用long int(m39 prime)並將其存儲為二進制文件。 當我嘗試將bin值寫入文件時,它將被寫為字符串。

>>> m39 = bin(2**13466917-1)
>>> open('m39', 'wb').write(m39) 
madsc13ntist@jaberwock:~/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轉換為字節數組或用於寫入的緩沖區。 我應該使用io還是memoryview等

非常感謝任何人提供的任何幫助。 :)

我正在使用Python 2.7.3,如果可能的話,我更喜歡內置模塊。

編輯:我試圖將值存儲為二進制文件,這將占用更少的磁盤/內存空間。 我知道bin類型是python中的一個字符串,但我試圖寫\\x11\\x11\\x11\\x11 not \\x31\\x31\\x31\\x31 我的目的不是打印值的字符串表示,而是有效地存儲它以供以后使用/操作。

您應該使用結構模塊或數組,具體取決於數據的結構(即,對於同質值數組,數組將更簡單/更快)。

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)

產生的十六進制轉儲(1,683,373字節):

 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)

產生的十六進制轉儲(1,683,365字節):

 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')

顯然,那里有一個模式,而只是存儲素數的指數會更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM