2013-08-14 13 views
16

Mam listę, która wygląda tak:Python Peklowanie/unpickle listy do/z pliku

a = [['a string', [0, 0, 0], [22, 'bee sting']], ['see string', 
    [0, 2, 0], [22, 'd string']]] 

i mam problemy zapisywania i pobierania go.

mogę zapisać go ok używając Marynata:

with open('afile','w') as f: 
    pickle.dump(a,f) 

ale pojawia się następujący błąd, gdy próbuję go załadować:

pickle.load('afile') 

Traceback (most recent call last): 
    File "<pyshell#116>", line 1, in <module> 
    pickle.load('afile') 
    File "C:\Python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "C:\Python27\lib\pickle.py", line 841, in __init__ 
    self.readline = file.readline 
AttributeError: 'str' object has no attribute 'readline' 

myślałem, że mogę przekonwertować do numpy tablicy i użyj save, savez lub . Jednak otrzymuję następujący błąd:

>>> np.array([a]) 

Traceback (most recent call last): 
    File "<pyshell#122>", line 1, in <module> 
    np.array([a]) 
ValueError: cannot set an array element with a sequence 
+5

Zamiast pickle.load ('afile') do pickle.load (open ('afile')) –

+0

Oczywiście! dziękuję - dlaczego nie umieszczasz tego jako odpowiedzi .. – atomh33ls

+0

Nie możesz łatwo przekonwertować tego, co masz na "numpy.array", ponieważ ma nieregularny kształt. Musiałbyś stworzyć dużą regularną tablicę, a następnie wypełnić wszystkie dane za pomocą 'NaN' lub czegoś podobnego ... w zasadzie to, co' pandas' robi dla ciebie. Prawdopodobnie jest to jednak przesada dla twojej małej listy. –

Odpowiedz

31

Postanowiłem zrobić to jako odpowiedź. Metoda pickle.load oczekuje, że otrzyma plik podobny do obiektu, ale zamiast tego podajesz łańcuch, a zatem wyjątek. Więc zamiast:

pickle.load('afile') 

należy zrobić:

pickle.load(open('afile', 'rb')) 
+2

może "open" ("afile", "rb") '. Uwaga z dokumentacji 'pickle': * Upewnij się, że zawsze otwierasz pliki pikle utworzone za pomocą protokołów> = 1 w trybie binarnym. * – cdarke

13

Aby dodać do @ odpowiedź Rapolas K za:

Okazało się, że miałem problemy z pliku nie zamykając tak stosowali tę metodę:

with open('afile','rb') as f: 
    pickle.load(f)