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?
open('filename', 'wb')
Odpowiedzi:
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.load
zrobisz, 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.load
ponownie, 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
źródło
W pandach 0.22+ dostępna jest funkcja read_pickle
import pandas as pd object = pd.read_pickle(r'filepath')
źródło
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()
źródło
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/
źródło
Nic z nim nie robisz, tylko ładujesz plik.
for line in x: print x
wydrukuje każdą linię. (W drugim z oświadczeniem)
źródło