web-dev-qa-db-de.com

Wie kann ich mehrere Variablen in Python speichern und wiederherstellen?

Ich muss ungefähr ein Dutzend Objekte in einer Datei speichern und sie später wiederherstellen. Ich habe versucht, eine for-Schleife mit Pickle und Shelve zu verwenden, aber es hat nicht funktioniert.

Bearbeiten.
Alle Objekte, die ich retten wollte, waren in derselben Klasse (ich hätte das vorher erwähnen sollen), und ich wusste nicht, dass ich die ganze Klasse einfach so retten könnte:

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'
78
jvandereay

Wenn Sie mehrere Objekte speichern möchten, können Sie sie einfach in eine einzige Liste oder in Tuple einfügen:

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)

Wenn Sie über viele Daten verfügen, können Sie die Dateigröße reduzieren, indem Sie protocol=-1 an dump() übergeben. pickle verwendet dann das beste verfügbare Protokoll anstelle des Standardprotokolls (und abwärtskompatibler). In diesem Fall muss die Datei im Binärmodus geöffnet werden (wb und rb).

Der binäre Modus sollte auch mit Python 3 verwendet werden, da sein Standardprotokoll binäre Daten (d. H. Nichttextdaten) erzeugt (Schreibmodus 'wb' und Lesemodus 'rb').

129
Eric O Lebigot

Es gibt eine eingebaute Bibliothek namens pickle . Mit pickle können Sie Objekte in eine Datei sichern und später laden.

import pickle

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

f = open('store.pckl', 'rb')
obj = pickle.load(f)
f.close()
36
Yossi

Sie sollten sich die Module shelve und pickle ansehen. Wenn Sie viele Daten speichern müssen, ist es möglicherweise besser, eine Datenbank zu verwenden

10
John La Rooy

Sie können klepto verwenden, das permanente Zwischenspeicherung auf Arbeitsspeicher, Datenträger oder Datenbank ermöglicht.

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

Dann, nach dem Neustart des Interpreters ...

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

Den Code erhalten Sie hier: https://github.com/uqfoundation

4
Mike McKerns

Ein weiterer Ansatz zum Speichern mehrerer Variablen in einer Pickle-Datei ist:

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
1

Der folgende Ansatz scheint einfach zu sein und kann mit Variablen unterschiedlicher Größe verwendet werden:

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