从File加载Python对象(可能没有类定义)

时间:2015-09-23 03:19:54

标签: python python-2.7 serialization

我是Python的新手。

我的数据格式如下:

ontology = {


  'OBJECT' :


    {'IS-A' : {'VALUE' :'ALL'},


     'SUBCLASSES' : {'VALUE' :['PHYSICAL-OBJECT',


                               'MENTAL-OBJECT','SOCIAL-OBJECT']},


     'THEME-OF' : {'sem' : 'EVENT'}},





 'PHYSICAL-OBJECT' :


    {'IS-A' : {'VALUE' :'OBJECT'},


     'SUBCLASSES' : {'VALUE' :['ANIMATE', 'INANIMATE']},


     'THEME-OF' : {'sem' : 'EVENT'}},
}

我想将所有这些数据加载到Python字典中。 但是如果我使用了eval(file.read()),我会收到错误。

我有什么方法可以做到这一点? (我没有任何课程定义)

2 个答案:

答案 0 :(得分:0)

出于安全原因,Eval通常是一个糟糕的计划,你最好使用pickle或JSON进行序列化。

但是它不会被读取,因为您无法使用eval()分配变量=。如果这是确切的格式,你可以尝试在=和eval()之后跳过其余的:

data = open('data.txt').read()
ontology = eval(data[data.find('=')+1:])

答案 1 :(得分:0)

Using eval is a really bad idea。请改用ast.literal_eval

为了实现这一目标,你必须摆脱ontology =部分,这是不需要的。只在文件中保留字典本身。

然后,按如下方式加载:

>>> import ast
>>> with open('data.txt') as file:
...     data = ast.literal_eval(file.read())
... 
>>> data
{'PHYSICAL-OBJECT': {'IS-A': {'VALUE': 'OBJECT'}, 'THEME-OF': {'sem': 'EVENT'}, 'SUBCLASSES': {'VALUE': ['ANIMATE', 'INANIMATE']}}, 'OBJECT': {'IS-A': {'VALUE': 'ALL'}, 'THEME-OF': {'sem': 'EVENT'}, 'SUBCLASSES': {'VALUE': ['PHYSICAL-OBJECT', 'MENTAL-OBJECT', 'SOCIAL-OBJECT']}}}