alternative - pickle python deutsch



Speichern und Laden mehrerer Objekte in der Pickle-Datei? (4)

Die Verwendung einer Liste, eines Tupels oder eines Diktats ist bei weitem die gebräuchlichste Methode:

import pickle
PIK = "pickle.dat"

data = ["A", "b", "C", "d"]
with open(PIK, "wb") as f:
    pickle.dump(data, f)
with open(PIK, "rb") as f:
    print pickle.load(f)

Das druckt:

['A', 'b', 'C', 'd']

Eine Pickle-Datei kann jedoch eine beliebige Anzahl von Pickles enthalten. Hier ist Code, der die gleiche Ausgabe produziert. Beachten Sie jedoch, dass es schwieriger ist zu schreiben und zu verstehen:

with open(PIK, "wb") as f:
    pickle.dump(len(data), f)
    for value in data:
        pickle.dump(value, f)
data2 = []
with open(PIK, "rb") as f:
    for _ in range(pickle.load(f)):
        data2.append(pickle.load(f))
print data2

Wenn Sie dies tun, sind Sie dafür verantwortlich, zu wissen, wie viele Gurken in der Datei enthalten sind, die Sie schreiben. Der obige Code erledigt das, indem er zuerst die Anzahl der Listenobjekte in die Liste einfügt.

Ich habe eine Klasse, die Spielern in einem Spiel dient, sie erstellt und andere Dinge.

Ich muss diese Spielerobjekte in einer Datei speichern, um sie später zu verwenden. Ich habe Pickle-Modul versucht, aber ich weiß nicht, wie Sie mehrere Objekte speichern und erneut laden? Gibt es eine Möglichkeit, das zu tun, oder sollte ich andere Klassen wie Listen verwenden und meine Objekte in einer Liste speichern und laden?

Gibt es einen besseren Weg?


Ich werde eine objektorientierte Demo mit pickle , um ein oder mehrere object zu speichern und wiederherzustellen:

class Worker(object):

    def __init__(self, name, addr):
        self.name = name
        self.addr = addr

    def __str__(self):
        string = u'[<Worker> name:%s addr:%s]' %(self.name, self.addr)
        return string

# output one item
with open('testfile.bin', 'wb') as f:
    w1 = Worker('tom1', 'China')
    pickle.dump(w1, f)

# input one item
with open('testfile.bin', 'rb') as f:
    w1_restore = pickle.load(f)
print 'item: %s' %w1_restore

# output multi items
with open('testfile.bin', 'wb') as f:
    w1 = Worker('tom2', 'China')
    w2 = Worker('tom3', 'China')
    pickle.dump([w1, w2], f)

# input multi items
with open('testfile.bin', 'rb') as f:
    w_list = pickle.load(f)

for w in w_list:
    print 'item-list: %s' %w

Ausgabe:

item: [<Worker> name:tom1 addr:China]
item-list: [<Worker> name:tom2 addr:China]
item-list: [<Worker> name:tom3 addr:China]

Versuche dies:

import pickle

file = open('test.pkl','wb')
obj_1 = ['test_1', {'ability', 'mobility'}]
obj_2 = ['test_2', {'ability', 'mobility'}]
obj_3 = ['test_3', {'ability', 'mobility'}]

pickle.dump(obj_1, file)
pickle.dump(obj_2, file)
pickle.dump(obj_3, file)

file.close()

file = open('test.pkl', 'rb')
obj_1 = pickle.load(file)
obj_2 = pickle.load(file)
obj_3 = pickle.load(file)
print(obj_1)
print(obj_2)
print(obj_3)
file.close()

Zwei Ergänzungen zu Tim Peters 'akzeptierter Antwort .

Zunächst müssen Sie die Anzahl der einzeln gebeizten Artikel nicht separat speichern, wenn Sie nicht mehr laden, wenn Sie das Ende der Datei erreichen:

def loadall(filename):
    with open(filename, "rb") as f:
        while True:
            try:
                yield pickle.load(f)
            except EOFError:
                break

items = loadall(myfilename)

Dies setzt voraus, dass die Datei nur Pickles enthält. Wenn da noch etwas anderes drin ist, wird der Generator versuchen, das, was noch drin ist, als Pickles zu behandeln, was gefährlich sein könnte.

Zweitens erhält man auf diese Weise keine Liste, sondern einen generator . Dadurch wird immer nur ein Element in den Speicher geladen, was nützlich ist, wenn die Datenmenge sehr groß ist - ein möglicher Grund, warum Sie möglicherweise mehrere Elemente separat in den Speicher legen wollten. Sie können immer noch items mit einer for Schleife durchlaufen, als wäre es eine Liste.





pickle