2016-01-28 15 views
12

stworzyłem jakieś dane i przechowywane go kilka razy tak:Jak czytać plik pikle?

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

każdym razem, gdy rozmiar pliku wzrosła, ale gdy otwieram plik

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

oglądam tylko dane z ostatniego czasu. Jak mogę poprawnie odczytać plik?

+1

Dołączasz obiekty do swojego pliku. Po rozpakowaniu odszyfrujesz tylko pierwszy wpis. Czy na pewno potrzebujesz tych wszystkich wpisów? Jeśli nie - zmień na 'open ('filename', 'wb')' – Andrey

+0

Tak, potrzebuję wszystkich wpisów. Rozmiar plików pokazuje, że zawiera wszystko. –

+1

Następnie @jsbueno ma rację w swojej odpowiedzi. – Andrey

Odpowiedz

21

Pickle serializuje pojedynczy obiekt na raz i odczytuje pojedynczy obiekt - piklowane dane są zapisywane kolejno w pliku.

Jeśli po prostu wykonujesz pickle.load powinieneś czytać pierwszy obiekt zserializowany do pliku (nie ostatni, jak już napisałeś).

Po unserializing pierwszy obiekt, plik-wskaźnik jest na początku działalności kolejnego obiektu - jeśli po prostu zadzwonić pickle.load ponownie, odczyta, że ​​następny przedmiot - zrobić, że aż do końca pliku.

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

Twoje nic nie robi z tym, że tylko ładuje plik.

for line in x: 
    print x 

wydrukuje każdy wiersz. (W drugim z instrukcją)

2

Poniżej znajduje się przykład, w jaki sposób można napisać i przeczytać plik pikle. Zauważ, że jeśli będziesz nadal dołączał dane pikle do pliku, będziesz musiał kontynuować czytanie z pliku, dopóki nie znajdziesz tego, co chcesz, lub nie wygenerujesz wyjątku, docierając do końca pliku. Tak właśnie działa 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()