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

Python 使用ConfigObj或PyYaml将字典对提取到交互式工作区中,python,json,parsing,configparser,pyyaml,Python,Json,Parsing,Configparser,Pyyaml,我一直想通过从一个简单的文本文件中读取变量来定义Python中的变量。因此,我对ConfigParser、ConfigObj、PyYaml和JSON做了一些阅读。目前我对ConfigObj和PyYaml特别感兴趣。然而,我还没有以一种干净的方式去做我想做的事情 使用ConfigObj和PyYaml,我可以将外部文本文件中定义的所有内容加载到字典中。我想通过提取所有键值对并将它们作为单独的变量存储到我的交互式工作区来继续使用这个字典 这是迄今为止我一直使用的Pyaml方法: import yaml

我一直想通过从一个简单的文本文件中读取变量来定义Python中的变量。因此,我对ConfigParser、ConfigObj、PyYaml和JSON做了一些阅读。目前我对ConfigObj和PyYaml特别感兴趣。然而,我还没有以一种干净的方式去做我想做的事情

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

这是迄今为止我一直使用的Pyaml方法:

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是否具有实现上述功能的内置函数?

如果

import __main__
那你可以

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

__main__.__dict__.update(config)

这是否明智在很大程度上取决于当您的全局函数被yaml条目覆盖时,您对惊喜的重视程度。

假设我正确理解了您的问题,下面应该做您想做的事情

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

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

虽然这是可行的,但我建议你还是坚持用字典记录你的价值观。如果局部变量不存在,只引用字典有什么错?

事实上,我正在使用MATLAB,但为了更大的灵活性,我也在使用Python。最终目标是以MATLAB二进制格式(或mat文件)存储配置文件中定义的参数。我写的MATLAB程序使用普通的局部变量,所以我不得不远离字典。我不太明白为什么这意味着你需要在Python中使用locals(),但只要你明白这不是“最佳实践”和风险等等,到目前为止。你还打算如何将变量存储在mat文件中?当然,我可以重写我的整个MATLAB程序,使其以不同的方式工作。但我相信解析配置所需的脚本应该符合程序,而不是相反。