2016-01-28 12 views
12

Ich habe einige Daten und gespeichert es mehrmals wie folgt aus:Wie liest man die Beizdatei?

with open('filename', 'a') as f: 
     pickle.dump(data, f) 

Jedes Mal, wenn die Größe der Datei erhöht, aber wenn ich Datei öffnen

with open('filename', 'rb') as f: 
    x = pickle.load(f) 

Ich sehe nur Daten aus der letzten Zeit. Wie kann ich die Datei korrekt lesen?

+1

Sie hängen Objekte an Ihre Datei an. Wenn du die Pipette abnimmst, entpacke nur den ersten Eintrag. Sind Sie sicher, dass Sie alle diese Einträge benötigen? Wenn nicht - ändere zu 'open ('filename', 'wb')' – Andrey

+0

Ja, ich brauche alle Einträge. Die Größe der Dateien zeigt, dass sie alles enthält. –

+1

Dann ist @jsbueno in seiner Antwort richtig. – Andrey

Antwort

21

Pickle serialisiert ein einzelnes Objekt nach dem anderen, und liest ein einzelnes Objekt - die eingelegten Daten wird nacheinander in der Datei aufgezeichnet.

Wenn Sie einfach pickle.load tun, sollten Sie das erste serialisierte Objekt in die Datei lesen (nicht das letzte, wie Sie geschrieben haben).

Nach dem ersten Objekt deserialisieren, wird die Datei-Zeiger am beggining des nächsten Objekts - wenn Sie einfach pickle.load wieder aufrufen, wird es das nächste Objekt gelesen - tun, dass bis zum Ende der Datei.

objects = [] 
with (open("myfile", "rb")) as openfile: 
    while True: 
     try: 
      objects.append(pickle.load(openfile)) 
     except EOFError: 
      break 
-5

Ihre nichts tun, damit Sie nur die Datei laden.

for line in x: 
    print x 

wird jede Zeile gedruckt. (In der zweiten mit Anweisung)

2

Das folgende Beispiel zeigt, wie Sie eine Beizdatei schreiben und lesen können. Beachten Sie, dass Sie, wenn Sie die Beizdaten an die Datei anhängen, weiterhin so lange aus der Datei lesen müssen, bis Sie das gewünschte Ergebnis gefunden haben oder eine Ausnahme generiert wird, indem Sie das Ende der Datei erreichen. Das macht die letzte Funktion.

import os 
import pickle 


PICKLE_FILE = 'pickle.dat' 


def main(): 
    # append data to the pickle file 
    add_to_pickle(PICKLE_FILE, 123) 
    add_to_pickle(PICKLE_FILE, 'Hello') 
    add_to_pickle(PICKLE_FILE, None) 
    add_to_pickle(PICKLE_FILE, b'World') 
    add_to_pickle(PICKLE_FILE, 456.789) 
    # load & show all stored objects 
    for item in read_from_pickle(PICKLE_FILE): 
     print(repr(item)) 
    os.remove(PICKLE_FILE) 


def add_to_pickle(path, item): 
    with open(path, 'ab') as file: 
     pickle.dump(item, file, pickle.HIGHEST_PROTOCOL) 


def read_from_pickle(path): 
    with open(path, 'rb') as file: 
     try: 
      while True: 
       yield pickle.load(file) 
     except EOFError: 
      pass 


if __name__ == '__main__': 
    main() 
Verwandte Themen