如何从文本文件中读取字典?

时间:2019-04-24 05:12:46

标签: python python-3.x dictionary text

我有以下格式的文本文件

d = {'EMS':1,'ESC': 2, 'HVAC': 3,'IC' : 4,'ICU' : 5,'IS' : 6,'ITM' : 7,'MBFM' : 8,'PKE' : 9,'RPAS' : 10,'RVC' : 11,'SAS' : 12,'SRS' : 13,'TCU' : 14,'TPMS' : 15,'VCU' : 16,'BMS' : 17,'MCU' :18,'OBC' :19}

如何阅读字典以找到特定值?

我尝试了以下代码

with open(r"filename","r") as f:
    data = ast.literal_eval(f.read())
    print(data)
    for age in data.values():
        if age == search_age:
            name = data[age]
            print (name)

2 个答案:

答案 0 :(得分:3)

您的文本文件是有效的Python代码,因此,如果来自受信任的来源,则只需执行以下操作:

with open("filename") as f:
    exec(f.read())

和变量d会与字典一起加载。

但是,如果文本文件不是来自受信任的来源,则可以使用ast.parse来解析代码,然后使用ast.walk遍历抽象语法树并查找{{1} }节点。出于安全原因,在将dict节点包装为Dict的主体并将其编译为Call并将其转换为存储的真实dict之前,请确保dict节点不包含任何Expression节点在变量eval中:

d

鉴于您的示例输入,import ast with open("filename") as f: for node in ast.walk(ast.parse(f.read())): if isinstance(node, ast.Dict) and \ not any(isinstance(child, ast.Call) for child in ast.walk(node)): d = eval(compile(ast.Expression(body=node), '', 'eval')) break else: print('No valid dict found.') 将变为:

d

答案 1 :(得分:0)

您需要遍历键和值:

with open('filename') as f:
    data = ast.literal_eval(f.read())
    print(data)
    for name, age in data.items():
        if age == search_age:
            print(name)

此外,该文件看起来像是有效的JSON对象,因此您可能应该在json.load上使用ast.literal_eval