我正在尝试在python中创建一个家谱,我想创建一个Persons字典,其中键是人的名字,值是该名称的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 :(得分:1)
ast.literal_eval
不用于评估和理解自定义对象。它用于评估字符串和文字安全。您需要使用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代替python进行酸洗,从而提高速度。
如果您之前没有听说过对象序列化,请read this。