2011-11-30 19 views
5

Używam najnowszego wydania Pythona, a po wyszukiwaniu nie mogę znaleźć niczego na piklach, które będzie dla mnie działać.Składnia pikle Pythona

Po prostu przechodzę przez samouczki, próbując nauczyć się o trawieniu i żaden z kodu źródłowego, który najwyraźniej działa na samouczkach, nie zadziała dla mnie, podejrzewam, że ma to coś wspólnego z nieaktualnymi tutorialami.

Co próbowałem i to samo, co pokazują tutoriale jest:

import pickle 
lists = [1,2,3,4,5] 
pickle.dump(lists, open('log.txt', 'a+')) 

która daje mi następujący błąd:

Traceback (most recent call last): 
File "<pyshell#2>", line 1, in <module> 
pickle.dump(lists, open('log.txt', 'a+')) 
TypeError: must be str, not bytes 

to

>>> import pickle 
>>> unpicklefile = open('log.txt', 'r') 
>>> unpickledlist = [1,2,3,4,5] 
>>> unpickledlist = pickle.load(unpicklefile) 

daje mi następujący błąd:

Traceback (most recent call last): 
File "<pyshell#3>", line 1, in <module> 
unpickledlist = pickle.load(unpicklefile) 
TypeError: 'str' does not support the buffer interface 

Dziękuję za odpowiedzi i pomoc

+0

Twój kod działa poprawnie dla mnie bez błędów (z wyjątkiem dopasowania nazw plików). Więc ** jaki błąd rzeczywiście dostałeś **? –

+0

edytował pytanie –

+0

Wygląda na to, że podążacie za tutorialem zaprojektowanym dla Pythona 2.x, podczas gdy wydaje się, że faktycznie używacie Pythona 3.x. Istnieją subtelne różnice i jeśli chcesz używać Pythona 3.x, najlepiej postępować zgodnie z samouczkiem zaprojektowanym dla tej wersji. –

Odpowiedz

2

Tryb 'a+' może być przyczyną Ci problemów. A jeśli jesteś w systemie Windows, warto otworzyć plik w trybie binarnym. Ponadto należy zamknąć plik przed ponownym otwarciem, aby go ponownie wczytać. Upewnij się, że piszesz i czytasz ten sam plik ("log.txt" zamiast "nazwa pliku"):

import pickle 
lists = [1,2,3,4,5] 

f = open('tmp_pickle.pic', 'wb') 
pickle.dump(lists, f) 
f.close() 

f = open('tmp_pickle.pic', 'rb') 
unpickledlist = pickle.load(f) 
print unpickledlist 
+0

To wydaje się działać dla mnie, więc prawdopodobnie masz rację, ponieważ problem polega na tym, że używam "a +". Dziękuję za pomoc :) –

+0

Ta odpowiedź rozwiązuje problem, ponieważ otwarcie pliku w trybie '' b'' (w Pythonie 3.x) oczekuje 'bajtów' od programu piszącego zamiast' str' (który jest niekodowanym Unicode strunowy). Moduł 'pickle' spodziewa się, że będzie w stanie napisać' bytes', zobacz dokumentację 'pickle.dump' (http://docs.python.org/py3k/library/pickle.html#pickle.dump). ("Argument * file * musi mieć metodę write(), która akceptuje pojedynczy argument bajtowy.") –