約12個のオブジェクトをファイルに保存して、後で復元する必要があります。ピクルスとシェルフでforループを使用しようとしましたが、正しく機能しませんでした。
編集。
保存しようとしていたオブジェクトはすべて同じクラスに属していました(これについては前に言及したはずです)。
def saveLoad(opt):
global calc
if opt == "save":
f = file(filename, 'wb')
pickle.dump(calc, f, 2)
f.close
print 'data saved'
Elif opt == "load":
f = file(filename, 'rb')
calc = pickle.load(f)
else:
print 'Invalid saveLoad option'
複数のオブジェクトを保存する必要がある場合は、たとえば、それらを単一のリストまたはタプルに単純に入れることができます。
import pickle
# obj0, obj1, obj2 are created here...
# Saving the objects:
with open('objs.pkl', 'w') as f: # Python 3: open(..., 'wb')
pickle.dump([obj0, obj1, obj2], f)
# Getting back the objects:
with open('objs.pkl') as f: # Python 3: open(..., 'rb')
obj0, obj1, obj2 = pickle.load(f)
大量のデータがある場合は、protocol=-1
をdump()
に渡すことでファイルサイズを小さくできます。 pickle
は、デフォルトの履歴(およびより下位互換性のある)プロトコルの代わりに、利用可能な最適なプロトコルを使用します。この場合、ファイルはバイナリモードで開く必要があります(それぞれwb
およびrb
)。
バイナリモードはPython 3でも使用する必要があります。そのデフォルトプロトコルはバイナリ(つまり、非テキスト)データ(書き込みモード'wb'
および読み取りモード'rb'
)を生成するためです。
klepto
を使用できます。これは、メモリ、ディスク、またはデータベースへの永続的なキャッシュを提供します。
dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('foo.txt')
>>> db['1'] = 1
>>> db['max'] = max
>>> squared = lambda x: x**2
>>> db['squared'] = squared
>>> def add(x,y):
... return x+y
...
>>> db['add'] = add
>>> class Foo(object):
... y = 1
... def bar(self, x):
... return self.y + x
...
>>> db['Foo'] = Foo
>>> f = Foo()
>>> db['f'] = f
>>> db.dump()
>>>
次に、インタープリターの再起動後...
dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('foo.txt')
>>> db
file_archive('foo.txt', {}, cached=True)
>>> db.load()
>>> db
file_archive('foo.txt', {'1': 1, 'add': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True)
>>> db['add'](2,3)
5
>>> db['squared'](3)
9
>>> db['f'].bar(4)
5
>>>
ここでコードを取得します: https://github.com/uqfoundation
複数の変数をpickleファイルに保存する別の方法は次のとおりです。
import pickle
a = 3; b = [11,223,435];
pickle.dump([a,b], open("trial.p", "wb"))
c,d = pickle.load(open("trial.p","rb"))
print(c,d) ## To verify
次のアプローチは単純に思え、異なるサイズの変数で使用できます。
import hickle as hkl
# write variables to filename [a,b,c can be of any size]
hkl.dump([a,b,c], filename)
# load variables from filename
a,b,c = hkl.load(filename)