Как я могу хранить / повторно хранить экземпляры объектов класса с помощью pickle?

#python #serialization #pickle

#python #сериализация #pickle

Вопрос:

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

я намерен создать единый словарь со всеми параметрами (скаляры, списки, словари), Которые содержат целые числа, числа, строки, экземпляры классов и т. Д., И сбросить его в pickle следующим образом:

 pickle_dict = {}

pickle_dict['RunDir'] = RunDir
pickle_dict['filename_cfg'] = filename_cfg
pickle_dict['fluid_num'] = fluid_num
pickle_dict['body_num'] = body_num
pickle_dict['sleeve_matl'] = sleeve_matl
pickle_dict['ctg_matl'] = ctg_matl
pickle_dict['dowel_matl'] = dowel_matl
pickle_dict['beam_matl'] = beam_matl
#pickle_dict['MyBolts'] = MyBolts
#pickle_dict['MyScdmComps'] = MyScdmComps
pickle_dict['dowel_num'] = dowel_num
pickle_dict['beam_num'] = beam_num
pickle_dict['sleeve_num'] = sleeve_num
#pickle_dict['MyComps'] = MyComps
#pickle_dict['BN2CN'] = BN2CN
#pickle_dict['PN2CN'] = PN2CN
pickle_dict['intf_list'] = intf_list
pickle_dict['int_real'] = int_real
pickle_dict['int_type'] = int_type
pickle_dict['assy_mode'] = assy_mode
pickle_dict['coating_face_id'] = coating_face_id
pickle_dict['cooling_face_id'] = cooling_face_id
pickle_dict['mapped_face_id'] = mapped_face_id
pickle_dict['axial_div'] = axial_div
pickle_dict['slv_radial_div'] = slv_radial_div
pickle_dict['ctg_radial_div'] = ctg_radial_div
pickle_dict['circ_div'] = circ_div
pickle_dict['bolt_ndiv'] = bolt_ndiv
pickle_dict['bolt_assy_imp'] = bolt_assy_imp
pickle_dict['bolt_num'] = bolt_num

with open(filename_cfg   '.pickle', 'wb') as filename:
    pickle.dump(pickle_dict, filename)
  

Я прокомментировал данные, которые не «загружаются», поскольку они состоят из списков экземпляров класса.
Я намерен прочитать данные обратно следующим образом:

 with open(filename_cfg   '.pickle', 'rb') as filename:
    pickle_dict = pickle.load(filename)

RunDir = pickle_dict['RunDir']
filename_cfg = pickle_dict['filename_cfg']
fluid_num = pickle_dict['fluid_num']
body_num = pickle_dict['body_num']
sleeve_matl = pickle_dict['sleeve_matl'] 
ctg_matl = pickle_dict['ctg_matl'] 
dowel_matl = pickle_dict['dowel_matl']
beam_matl = pickle_dict['beam_matl']
MyBolts = pickle_dict['MyBolts']
MyScdmComps = pickle_dict['MyScdmComps']
dowel_num = pickle_dict['dowel_num']
beam_num = pickle_dict['beam_num']
sleeve_num = pickle_dict['sleeve_num']
MyComps = pickle_dict['MyComps']
BN2CN = pickle_dict['BN2CN']
PN2CN = pickle_dict['PN2CN']
intf_list = pickle_dict['intf_list']
int_real = pickle_dict['int_real']
int_type = pickle_dict['int_type']
assy_mode = pickle_dict['assy_mode']
coating_face_id = pickle_dict['coating_face_id']
cooling_face_id = pickle_dict['cooling_face_id']
mapped_face_id = pickle_dict['mapped_face_id']
axial_div = pickle_dict['axial_div']
slv_radial_div = pickle_dict['slv_radial_div']
ctg_radial_div = pickle_dict['ctg_radial_div']
circ_div = pickle_dict['circ_div']
bolt_ndiv = pickle_dict['bolt_ndiv']
bolt_assy_imp = pickle_dict['bolt_assy_imp']
bolt_num = pickle_dict['bolt_num']
  

Я не уверен, есть ли лучший способ сделать это… это кажется очень окольным путем. В MATLAB я бы просто сохранил рабочее пространство и получил там всю информацию. Если есть лучший способ сделать это, я был бы очень признателен, если бы кто-нибудь указал мне правильное направление

Но как бы то ни было, прямо сейчас мои строки, которые терпят неудачу, терпят неудачу по следующей причине:

экземпляр body_ не имеет метода вызова

пример одного из параметров, который завершается ошибкой с указанной выше ошибкой, выглядит следующим образом:

BN2CN

 {0: [<.body_ instance at 0x0000000000000B67>], 1: [<.body_ instance at 0x0000000000000B93>], 2: [<.body_ instance at 0x0000000000000BA7>], 3: [<.body_ instance at 0x0000000000000BBB>], 4: [<.body_ instance at 0x0000000000000BD0>], 5: [<.body_ instance at 0x0000000000000BE4>], 6: [<.body_ instance at 0x0000000000000BF9>], 7: [<.body_ instance at 0x0000000000000C0D>]}
  

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

Есть ли что-то фундаментальное в экземплярах класса, с которыми нужно обращаться по-разному при хранении с использованием pickle? это просто невозможно? Есть ли лучший способ достичь того, что я ищу? В идеале я даже мог бы хранить определения классов в pickle (если это возможно)..

любая помощь будет с благодарностью!

Комментарии:

1. Я бы pip install dill и посмотрел, работает ли это для ваших целей, используя dill.dump_session('filename.pkl')

2. Наверное, я забыл упомянуть, что я использую IronPython, и я не уверен, что у меня есть возможность устанавливать дополнительные библиотеки на свой сервер. Есть ли способ сделать это с самим Pickle? или каким-либо другим способом? Большое спасибо!