2015-08-05 3 views
0

Я хочу знать, могу ли я сохранить объект с несколькими значениями/свойствами в один файл pickle или мне нужно сохранить каждое значение независимо? Вот код, у меня сейчас:Как Python раскроет объекты?

def __init__(self, id, targets, binaries): 
    self.id = id 
    self.targets = targets 
    self.binaries = binaries 

with open('PI0_Electron_data.pickle', 'wb') as output: 
    pickle.dump(PiElectron, output) 

Для лучшего понимания идентификатор представляет собой целое число, и обе цели и исполняемые файлы Numpy массивы. Смогу ли я получить идентификатор, цели и двоичные файлы объекта из этого единственного файла pickle или я должен создать три файла pickle? Также как я могу извлечь данные из файла pickle?

+0

Ну, это сработало с одним файлом, когда вы его попробовали? – Kevin

+0

Я пытаюсь это сейчас, но это занимает около 30 минут, потому что есть много данных. –

+0

Он должен работать. Используйте pickle.load, чтобы получить объект из файла. – saulspatz

ответ

2

Ваш код должен выглядеть следующим образом:

>>> class Thing(object): 
... def __init__(self, id, targets, binaries): 
...  self.id = id 
...  self.targets = targets 
...  self.binaries = binaries 
... 
>>> import numpy as np 
>>> t = Thing(1, np.arange(3), np.arange(3,9,2)) 
>>> 
>>> import dill 
>>> with open('electron_data.pkl', 'w') as f: 
... dill.dump(t, f) 
... 
>>> 

Где я использовал dill, чтобы дать вам лучшее сериализации ... по существу, dill могут мариновать экземпляры класса легко - как и большинство объектов Python. Затем, когда вы захотите вернуть объект, вам понадобится load.

Python 2.7.10 (default, May 25 2015, 13:16:30) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> with open('electron_data.pkl', 'r') as f: 
... t = dill.load(f) 
... 
>>> t 
<__main__.Thing object at 0x100394410> 
>>> t.id 
1 
>>> t.targets 
array([0, 1, 2]) 
>>> t.binaries 
array([3, 5, 7]) 
>>> 
>>> print dill.source.getsource(t.__class__) 
class Thing(object): 
    def __init__(self, id, targets, binaries): 
    self.id = id 
    self.targets = targets 
    self.binaries = binaries 

>>> 

Я надеюсь, что поможет ответить на ваш вопрос ... если ваш фактический код является более сложным (я предполагаю, что это такое), он должен еще работать, если нет unpicklable объект.

+0

Лучше, чем я мог надеяться. Спасибо –

+0

** Невероятный пакет, Майк. ** Вы должны принять публично, это ваш, авторский, пакет. ** Холодное задание! ** После краткого списка поддерживаемых функций вы могли бы подтвердить/отклонить dill.dump(), чтобы сохранить полный 3D-вид matplotlib в формате 3D-изображения на графике aDataSET на экземпляре ** Figure() ** и разрешить его передавать/получать/восстанавливать в удаленной системе с интерактивным 3D-просмотром DataSET с интерактивным движением мыши? – user3666197

+1

Да, это мой пакет, и спасибо. Я не могу подтвердить, что каждый объект «matplotlib» рассоряется с «укропом», но в нескольких командах было много усилий, чтобы убедиться, что есть хороший охват. См .: https://github.com/uqfoundation/dill/issues/4 –

Смежные вопросы