2011-07-04 19 views
54

Potrzebuję zapisać około tuzina obiektów do pliku, a następnie przywrócić je później. Próbowałem użyć pętli for z marynarką i półką, ale nie działało to dobrze.Jak zapisać i przywrócić wiele zmiennych w pythonie?

Edytuj.
Wszystkie obiekty, które starałem się oszczędzać były w tej samej klasie (Powinienem był o tym wspominałem wcześniej), a ja nie zdawałam sobie sprawy, że może po prostu uratować całą klasę tak:

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' 
+1

proszę umieścić kod przykładowy – Yossi

+1

Mówisz Próbowaliśmy pętli for. Opublikuj ten kod i wyjaśnij, dlaczego "nie działał poprawnie" (tzn. Co się stało i co chciałeś zrobić). – Blair

+0

Jeśli jesteś w systemie Windows, upewnij się, że otwierasz pliki w trybie binarnym –

Odpowiedz

9

Powinieneś spojrzeć na moduły shelve i pickle. Jeśli chcesz przechowywać dużo danych, lepiej użyć bazy danych:

27

Istnieje wbudowana biblioteka o nazwie pickle. Za pomocą pickle można zrzucić obiekty do pliku i załadować je później.

import pickle 

f = open('store.pckl', 'wb') 
pickle.dump(obj, f) 
f.close() 

f = open('store.pckl', 'rb') 
obj = pickle.load(f) 
f.close() 
+1

Używam Pythona 3.4: 'f = open ('store.pckl', 'wb')', aby otworzyć plik do zapisania. Zobacz http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytes I użyj 'f = open ('store.pckl', 'rb'), aby otworzyć plik do odczytania. Zobacz http://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interface. – user3731622

+0

czy to jest specyficzne dla wersji 3.4+? Niemal głosowałem za odpowiedzią, ponieważ generuje błędy, gdy nie używasz "b". –

93

Jeśli chcesz zaoszczędzić wiele obiektów, można po prostu umieścić je w jednej listy lub krotki, na przykład:

import pickle 

# obj0, obj1, obj2 are created here... 

# Saving the objects: 
with open('objs.pkl', 'w') as f: # Python 3: open(..., 'wb') 
    pickle.dump([obj0, obj1, obj2], f) 

# Getting back the objects: 
with open('objs.pkl') as f: # Python 3: open(..., 'rb') 
    obj0, obj1, obj2 = pickle.load(f) 

Jeśli masz dużo danych, można zmniejszyć rozmiar pliku przekazując protocol=-1 do dump(); pickle następnie użyje najlepszego dostępnego protokołu zamiast domyślnego protokołu historycznego (i bardziej wstecznego). W takim przypadku plik należy otworzyć w trybie binarnym (odpowiednio: wb i rb).

Tryb binarny powinien być również używany w Pythonie 3, ponieważ jego domyślny protokół wytwarza dane binarne (tzn. Inne niż tekstowe) (tryb zapisu 'wb' i tryb odczytu 'rb').

+4

W Pythonie 3.5 musiałem otworzyć plik w trybie "bajtowym", np. 'with open ('objs.pickle', 'wb') jako f:' (zwróć uwagę na 'wb'). – kbrose

+1

Dobra uwaga. Dodałem go do odpowiedzi. – EOL

2

Można użyć klepto, która zapewnia trwałe buforowanie pamięci, dysku lub bazy danych.

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db['1'] = 1 
>>> db['max'] = max 
>>> squared = lambda x: x**2 
>>> db['squared'] = squared 
>>> def add(x,y): 
... return x+y 
... 
>>> db['add'] = add 
>>> class Foo(object): 
... y = 1 
... def bar(self, x): 
...  return self.y + x 
... 
>>> db['Foo'] = Foo 
>>> f = Foo() 
>>> db['f'] = f 
>>> db.dump() 
>>> 

Następnie, po ponownym uruchomieniu interpretera ...

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db 
file_archive('foo.txt', {}, cached=True) 
>>> db.load() 
>>> db 
file_archive('foo.txt', {'1': 1, 'add': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True) 
>>> db['add'](2,3) 
5 
>>> db['squared'](3) 
9 
>>> db['f'].bar(4) 
5 
>>> 

Pobierz kod tutaj: https://github.com/uqfoundation

+0

To nie jest wbudowane ... – Zizouz212

+5

Program operacyjny nie prosi o wbudowanie. –

Powiązane problemy