Wie lese ich Pickle-Datei?


85

Ich habe einige Daten erstellt und mehrmals so gespeichert:

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

Jedes Mal, wenn die Größe der Datei zunimmt, aber wenn ich die Datei öffne

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

Ich kann nur Daten vom letzten Mal sehen. Wie kann ich eine Datei richtig lesen?


1
Sie hängen Objekte an Ihre Datei an. Wenn Sie die Auswahl aufheben, entfernen Sie nur den ersten Eintrag. Sind Sie sicher, dass Sie all diese Einträge benötigen? Wenn nicht - wechseln Sie zuopen('filename', 'wb')
Andrey

Ja, ich brauche alle Einträge. Die Größe der Dateien zeigt, dass sie alle enthalten.
Kenenbek Arzymatov

1
Dann ist @jsbueno richtig in seiner Antwort.
Andrey


Ich habe etwas erstellt, um Pickle-Dateien direkt in Ihrem Browser anzuzeigen
Christo S. Christov

Antworten:


91

Pickle serialisiert jeweils ein einzelnes Objekt und liest ein einzelnes Objekt zurück. Die eingelegten Daten werden nacheinander in der Datei aufgezeichnet.

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

Nach der Unserialisierung des ersten Objekts befindet sich der Dateizeiger am Anfang des nächsten Objekts. Wenn Sie einfach pickle.loaderneut aufrufen , wird das nächste Objekt gelesen. Führen Sie dies bis zum Ende der Datei aus.

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

21

Es gibt eine read_pickle- Funktion als Teil von pandas 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')

6

Das Folgende ist ein Beispiel dafür, wie Sie eine Pickle-Datei schreiben und lesen können. Beachten Sie, dass Sie, wenn Sie weiterhin Pickle-Daten an die Datei anhängen, so lange aus der Datei lesen müssen, bis Sie das gewünschte Element 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()


-25

Sie machen nichts damit, Sie laden nur die Datei.

for line in x:
    print x

druckt jede Zeile. (Im zweiten mit der Aussage)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.