使用ConfigObj或PyYaml将字典对提取到交互式工作区

时间:2013-07-26 01:49:07

标签: python json parsing configparser pyyaml

我一直想通过从简单的文本文件中读取变量来定义Python中的变量。因此,我在ConfigParser,ConfigObj,PyYaml和JSON上做了一些阅读。目前我对ConfigObj和PyYaml特别感兴趣。但是我还没有完全按照干净的方式做我想做的事。

使用ConfigObj和PyYaml,我可以将外部文本文件中定义的所有内容加载到字典中。我想通过提取所有键值对并将它们作为单独的变量存储到我的交互式工作区来继续这个词典。

这是我到目前为止使用的PyYaml方式:

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for i in range(len(keys)):
    string = keys[i] + '=' + str(values[i])
    eval(string)

使用eval有时会因为可能允许各种恶意事件发生而感到不满。因此,我想知道PyYaml和/或ConfigObj是否具有内置功能来实现上述目标?

2 个答案:

答案 0 :(得分:2)

假设我正确理解你的问题,以下应该做你想做的事。

注意:在覆盖密钥之前检查是否存在密钥,而是将其置于稍微不同的名称之下。

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for key,val in zip(keys,values):
    if key not in locals():
        locals()[key] = val
    else:
        locals()[key+"_yaml"] = val

虽然这有效,但我实际上建议你坚持使用带有你的价值的字典。如果本地变量不存在,只引用字典有什么问题?

答案 1 :(得分:1)

如果你

import __main__

然后你可以

__main__.__dict__[keys[i]] = values[i]

甚至

__main__.__dict__.update(config)

这是否明智取决于当您的全局函数被yaml条目覆盖时,您感到惊讶的程度。