2011-07-04 24 views
54

約1ダースのオブジェクトをファイルに保存し、後で復元する必要があります。 pickleとshelveでforループを使用しようとしましたが、正しく機能しませんでした。Pythonで複数の変数を保存して復元するにはどうすればよいですか?

編集。
私が保存しようとしていたオブジェクトのすべてが(私は前にこれを言及している必要があります)同じクラスにいた、と私はちょうどこのようなクラス全体を救うことができることを認識しませんでした:

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' 
+1

サンプルコード – Yossi

+1

を投稿してくださいあなたはループのために試してみたと言います。そのコードを投稿してください。なぜ「正しく動作しませんでした」(つまり、何が起こったのか、何を起こそうとしていたのか)。 – Blair

+0

Windowsの場合は、バイナリモードでファイルを開くようにしてください –

答えて

9

shelvepickleモジュールを見てください。大量のデータを格納する必要がある場合は、データベースを使用する方がよい場合があります。

27

pickleという名前の組み込みライブラリがあります。 pickleを使用すると、オブジェクトをファイルにダンプして後で読み込むことができます。

import pickle 

f = open('store.pckl', 'wb') 
pickle.dump(obj, f) 
f.close() 

f = open('store.pckl', 'rb') 
obj = pickle.load(f) 
f.close() 
+1

私はPython 3.4を使います: 'f = open( 'store.pckl'、 'wb')'書き込むファイルを開きます。 http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytesを参照して、 'f = open( 'store.pckl'、 'rb')を使用して読み込むファイルhttp://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interfaceを参照してください。 – user3731622

+0

は、3.4 +?私は、あなたが 'b'を使わないときにエラーを生成するので、ほぼ答えを落としました。 –

93

複数のオブジェクトを保存する必要がある場合、あなたは、単に例えば、単一のリスト、またはタプルでそれらを置くことができますが:

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=-1dump()に渡してファイルサイズを指定します。 pickleは、既定の履歴(およびより下位互換性のある)プロトコルの代わりに、利用可能な最高のプロトコルを使用します。この場合、ファイルはバイナリモード(それぞれwbrb)で開く必要があります。

バイナリモードは、デフォルトプロトコルがバイナリ(つまり非テキスト)データ(書き込みモード'wb'と読み取りモード'rb')を生成するため、Python 3でも使用する必要があります。

+4

Python 3.5では、ファイルを「バイト」モードで開く必要がありました。 '(' objs.pickle '、' wb ')をf: '(' wb'に注意してください。 – kbrose

+1

良い点。私は答えに加えました。 – EOL

2

メモリ、ディスク、またはデータベースに永続的なキャッシュを提供するkleptoを使用できます。

[email protected]>$ 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() 
>>> 

その後、通訳の再起動後に...

[email protected]>$ 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

+0

これは組み込みではありません... – Zizouz212

+5

OPは組み込みを求めませんでした。 –

関連する問題