#python #python_3x #сериализация
У меня есть произвольный объект, например упрощенно для класса: class Attribute: def __init__(self, x, y): self.x = x self.y = y def calc(): return self.x + self.y создаю объект: attr = Attribute(1, 1) Я хочу сохранить этот объект(attr) в строку и потом при необходимости его оттуда загрузить. Я пытался использовать модуль pickle, но не осилил. import pickle pickled = pickle.dumps(attr) spickled = str(pickled) unpickled = pickle.loads(spickled) Привело к ошибке: TypeError: a bytes-like object is required, not 'str' str(pickled) потому что на самом деле я должен сохранить свой объект в json как строку и потом считать оттуда при другом запуске. Собственно вопрос, как мне сохранить мой объект в json и потом его прочитать? Человекочитаемость не обязательно.
Ответы
Ответ 1
import pickle import base64 pickled = pickle.dumps(attr) spickled = base64.standard_b64encode(pickled) unpickled = pickle.loads(base64.standard_b64decode(spickled)) print(unpickled, unpickled.x, unpickled.y)Ответ 2
Если писать энкодер не вариант, значит, можно использовать менее элегантный способ: import ast import json import pickle class Attribute: def __init__(self, x, y): self.x = x self.y = y def calc(): return self.x + self.y def __eq__(self, oth): return self.__dict__ == oth.__dict__ obj = Attribute(1, 1) # --- dump object_bytes = pickle.dumps(obj) object_bytes_str = str(object_bytes) object_json_dump = json.dumps(object_bytes_str) # --- dump # --- load object_bytes_str = json.loads(object_json_dump) object_bytes = ast.literal_eval(object_bytes_str) obj_from_dump = pickle.loads(object_bytes) # --- load print(obj == obj_from_dump) Тут основная решаемая задача - получение bytes из строки с помощью ast.literal_eval. Пока писал, появился ответ от Xander, который куда более предпочтительнее.
Комментариев нет:
Отправить комментарий