2013-08-14 2 views
16

У меня есть список, который выглядит следующим образом:Python рассол/unpickle список в/из файла

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

и у меня возникают проблемы при сохранении его и извлечения его.

Я могу сохранить его в порядке, используя рассол:

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

но получаю следующее сообщение об ошибке при попытке загрузить его:

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' 

Я думал, что я мог бы преобразовать в Numpy массива и используйте save, savez или savetxt. Однако я получаю следующую ошибку:

>>> 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

Вместо pickle.load ('AFile') делать pickle.load (открытый ('AFile')) –

+0

конечно! спасибо. Почему бы вам не поместить это как ответ. – atomh33ls

+0

Вы не можете легко преобразовать то, что у вас есть, в 'numpy.array', поскольку оно имеет неправильную форму. Вам нужно будет создать большой регулярный массив, а затем заполнить все данные с помощью «NaN» или что-то в этом роде ... по существу, что «pandas» делает для вас. Однако это, вероятно, слишком велико для вашего небольшого списка. –

ответ

31

Решила сделать это как ответ. Метод pickle.load предполагает получение файла, подобного объекту, но вместо этого вы предоставляете строку и, следовательно, исключение. Таким образом, вместо:

pickle.load('afile') 

вы должны сделать:

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

возможно 'open ('afile', 'rb')'. Примечание из документации 'pickle': * Обязательно всегда открывайте файлы рассола, созданные с помощью протоколов> = 1 в двоичном режиме. * – cdarke

13

Чтобы добавить @ ответ Раполас Д.К.:

я обнаружил, что у меня были проблемы с файлом не закрывающий так используется этот метод:

with open('afile','rb') as f: 
    pickle.load(f) 
Смежные вопросы