Muszę zapisać do pliku kilkanaście obiektów, a następnie przywrócić je później. Próbowałem użyć pętli for z marynatą i półką, ale nie działało dobrze.
Edytować.
Wszystkie obiekty, które próbowałem zapisać, należały do tej samej klasy (powinienem był o tym wcześniej wspomnieć) i nie zdawałem sobie sprawy, że mogę po prostu zapisać całą klasę w ten sposób:
import pickle
def saveLoad(opt):
global calc
if opt == "save":
f = file(filename, 'wb')
pickle.dump(calc, f, 2)
f.close
print 'data saved'
elif opt == "load":
f = file(filename, 'rb')
calc = pickle.load(f)
else:
print 'Invalid saveLoad option'
Odpowiedzi:
Jeśli chcesz zapisać wiele obiektów, możesz po prostu umieścić je na jednej liście lub krotce, na przykład:
Jeśli masz dużo danych, możesz zmniejszyć rozmiar pliku, przekazując
protocol=-1
dodump()
;pickle
użyje wtedy najlepszego dostępnego protokołu zamiast domyślnego protokołu historycznego (i bardziej kompatybilnego wstecz). W tym przypadku, należy otworzyć plik w trybie binarnym (wb
irb
, odpowiednio).Tryb binarny powinien być również używany z Pythonem 3, ponieważ jego domyślny protokół tworzy dane binarne (tj. Nietekstowe) (tryb pisania
'wb'
i tryb odczytu'rb'
).źródło
with open('objs.pickle', 'wb') as f:
(Zwróć uwagę nawb
).with open('objs.pkl') as f:
po prostu porównywaćobj1, obj2 = pickle.load(open("objs.pkl","rb"))
? Czy jest jakaś różnica między tymi dwoma?Istnieje wbudowana biblioteka o nazwie
pickle
. Używającpickle
możesz zrzucić obiekty do pliku i załadować je później.źródło
f = open('store.pckl', 'wb')
do otwierania pliku do zapisu. Zajrzyj na stackoverflow.com/questions/13906623/ ... I użyj `f = open ('store.pckl', 'rb'), aby otworzyć plik do odczytu. Zobacz stackoverflow.com/questions/7031699/… .Powinieneś spojrzeć na półki i moduły do piklowania . Jeśli potrzebujesz przechowywać dużo danych, lepiej skorzystać z bazy danych
źródło
Innym podejściem do zapisywania wielu zmiennych w pliku marynaty jest:
źródło
Możesz użyć
klepto
, który zapewnia trwałe buforowanie do pamięci, dysku lub bazy danych.Następnie po restarcie tłumacza ...
Pobierz kod tutaj: https://github.com/uqfoundation
źródło
Poniższe podejście wydaje się proste i można je stosować ze zmiennymi o różnej wielkości:
źródło
hickle
pakiet jest bardziej niezawodny (mniej podatny na błędy) i jeszcze prostszy (mniej kodu) niżpickle
.