#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? или каким-либо другим способом? Большое спасибо!