2014-03-09 2 views
1

Я пытаюсь создать генеалогическое древо в python, и я хочу создать словарь лиц, где ключ - это имя человека, а значение - это объект Person для этого имени ,Сохранение словаря указателей в файл

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

import os, ast 

myFile = open(FILE, "r+")  # Opens the file for reading and writing 

tree = myFile.read() 

if tree == "": 
    tree = {} 
else: 
    tree = ast.literal_eval(tree) 


def save(): 
    myFile.write(str(tree)) 
    myFile.close() 

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

File "<unknown>", line 1 
    {'Charlie': <__main__.Person object at 0x00000000032DB860>} 
       ^
SyntaxError: invalid syntax 

Я подозреваю, что оценщик не может распознать объект, потому что, как только программа закрытие указателя больше не существует. Есть ли способ сохранить мой словарь, чтобы я мог перезагрузить его и получить доступ ко всем данным моих объектов Person, не теряя его каждый раз, когда моя программа закрывается?

+0

Использование pickle, это легко: https://wiki.python.org/moin/UsingPickle (или cPickle, чтобы идти быстрее) http://docs.python.org/2/library/pickle.html – fredtantini

+0

Обратите внимание, что Теги не являются ключевыми словами. Наполнение списка тегов, заполненных теми же словами, что и в вашем вопросе (словарь, класс, сохранение, чтение) не поможет его категоризировать. Обязательно прочитайте описания, которые появляются при выборе тегов! – Charles

ответ

1

ast.literal_eval не предназначен для оценки конкретных товаров. Он используется для оценки строк и литералов safely. Вам необходимо сериализовать свои данные, используя что-то вроде pickle.

>>> import pickle 
>>> class Person(object): 
...  def __init__(self, name): 
...   self.name = name 
... 
>>> persons = {'Charlie': Person('Charlie')} 
>>> with open(FILE, "wb") as my_file: 
...  pickle.dump(persons, my_file) 
... 
>>> with open(FILE, "rb") as f: 
...  result = pickle.load(f) 
...  
... 
>>> result 
{'Charlie': <__main__.Person object at 0x1598bd0>} 

Если у вас есть большие (или много) объектов, вы можете использовать cPickle, в котором травление делается в C вместо питона, таким образом, обеспечивая значительное увеличение скорости.

Если сериализация объектов - это то, о чем вы не слышали раньше, пожалуйста, read this.

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