我一直在尝试使用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转换为bytearray或写入缓冲区。我应该使用io还是memoryview等。
非常感谢任何人提供的任何帮助。 :)
我正在使用Python 2.7.3,如果可能的话,我更喜欢内置模块。
编辑:我试图将值存储为二进制文件,这将占用磁盘/内存上更少的空间。我知道bin类型是python中的字符串,但我试图写\x11\x11\x11\x11 not \x31\x31\x31\x31
。我的目的不是打印值的字符串表示,而是有效地存储它以供以后使用/操作。
答案 0 :(得分:2)
答案 1 :(得分: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)
产生的十六进制转储(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_bytes
和from_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')
显然那里有一个模式,而只是存储素数的指数会更有效。