2011-07-04 11 views
54

Bir dosyaya yaklaşık bir düzine nesne kaydetmem ve daha sonra geri yüklemem gerekiyor. Turşu ve raflı bir for döngüsü kullanmayı denedim ama doğru çalışmadı.Python'da çoklu değişkenleri nasıl kaydeder ve geri yüklerim?

Düzeltme.
Ben aynı sınıfta idi kurtarmaya çalışıyordu nesnelerin tüm (Bunu daha önce bahsetmeliydik) ve ben sadece bu gibi bütün dersleri kurtarabilecek fark etmemişti:

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

bir örnek kod – Yossi

+1

gönderilmesi için lütfen Sen döngü için denedim derler. Lütfen bu kodu ve neden "doğru çalışmadı" (yani, ne oldu ve ne yapmak istediğinizi) gönderin. – Blair

+0

Windows kullanıyorsanız, dosyaları ikili modda açtığınızdan emin olun. –

cevap

9

shelve ve pickle modüllerine bakmalısınız. Çok fazla veri depolamanız gerekiyorsa,

27

veritabanını kullanmak daha iyi olabilir. pickle adlı yerleşik bir kütüphane vardır. pickle'u kullanarak nesneleri bir dosyaya bırakıp daha sonra yükleyebilirsiniz. Birden fazla nesne kaydetmek gerekirse

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

I Python 3.4 kullanım zamanı: 'f = open ('store.pckl', 'wb')' yazmak için bir dosya açmak için. Http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytes adresine bakın ve açmak için f = open ('store.pckl', 'rb') kullanın. okumak için bir dosya. Http://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interface. – user3731622

+0

bu 3.4+ için özel mi? Neredeyse cevabı reddettim çünkü 'b' kullanmadığınız zaman hatalar üretir. –

93

, sadece örneğin tek bir liste veya başlığın koydum yapabilirsiniz: çok fazla veri varsa

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) 

, sen azaltabilir dosya boyutu protocol=-1'dan dump()'a geçirilerek; pickle, daha sonra varsayılan geçmiş (ve daha geriye dönük uyumlu) protokol yerine en uygun protokolü kullanır. Bu durumda, dosya ikili modda açılmalıdır (sırasıyla wb ve rb). varsayılan protokolü ikili üretir

ikili mod

da (yani metin dışı) verileri (modu 'rb' modu 'wb' yazma ve okuma), Python 3 kullanılmalıdır.

+4

Python 3.5'de, dosyayı "byte" modunda açmak zorundaydım, ör. 'ile açık ('objs.pickle', 'wb') olarak f:' (not wb'). – kbrose

+1

İyi nokta. Cevabı ekledim. – EOL

2

Bellek, disk veya veritabanına kalıcı önbellekleme sağlayan klepto kullanabilirsiniz.

[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() 
>>> 

Sonra tercüman yeniden başlatıldıktan sonra ...

[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 
>>> 

burada kodu alma: https://github.com/uqfoundation

+0

Bu yerleşik değil ... – Zizouz212

+5

OP, yerleşik için sormadı. –

İlgili konular