Jak czytać plik marynaty?

85

Utworzyłem dane i zapisałem je kilka razy w ten sposób:

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

Za każdym razem rozmiar pliku wzrastał, ale kiedy otwieram plik

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

Widzę tylko dane z ostatniego razu. Jak mogę poprawnie odczytać plik?

Kenenbek Arzymatov
źródło
1
Dołączasz obiekty do swojego pliku. Kiedy odbierasz, odbierasz tylko pierwszy wpis. Czy na pewno potrzebujesz wszystkich tych wpisów? Jeśli nie - zmień naopen('filename', 'wb')
Andrey
Tak, potrzebuję wszystkich wpisów. Rozmiar plików pokazuje, że zawiera wszystko.
Kenenbek Arzymatov
1
Wtedy @jsbueno ma rację w swojej odpowiedzi.
Andrey
Zbudowałem coś, aby przeglądać pliki marynaty bezpośrednio w przeglądarce: pickleviewer.com
Christo S. Christov

Odpowiedzi:

91

Pickle serializuje pojedynczy obiekt na raz i odczytuje z powrotem pojedynczy obiekt - wytrawione dane są zapisywane w sekwencji w pliku.

Jeśli po prostu to pickle.loadzrobisz, powinieneś czytać pierwszy obiekt serializowany do pliku (nie ostatni, jak napisałeś).

Po odserializowaniu pierwszego obiektu wskaźnik pliku znajduje się na początku następnego obiektu - jeśli po prostu zadzwonisz pickle.loadponownie, odczyta następny obiekt - zrób to do końca pliku.

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break
jsbueno
źródło
21

W pandach 0.22+ dostępna jest funkcja read_pickle

import pandas as pd

object = pd.read_pickle(r'filepath')
Taylrl
źródło
6

Poniżej znajduje się przykład tego, jak możesz pisać i czytać plik marynaty. Zwróć uwagę, że jeśli nadal będziesz dołączać dane marynaty do pliku, będziesz musiał kontynuować czytanie z pliku, aż znajdziesz to, czego chcesz, lub zostanie wygenerowany wyjątek po osiągnięciu końca pliku. To właśnie robi ostatnia funkcja.

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()
Noctis Skytower
źródło
6

Opracowałem narzędzie programowe, które otwiera (większość) plików Pickle bezpośrednio w przeglądarce (nic nie jest przesyłane, więc jest w 100% prywatne):

https://pickleviewer.com/

Christo S. Christov
źródło
-25

Nic z nim nie robisz, tylko ładujesz plik.

for line in x:
    print x

wydrukuje każdą linię. (W drugim z oświadczeniem)

Eric MacLeod
źródło