2013-07-26 22 views
1

我一直想通過從簡單的文本文件中讀取它們來定義Python中的變量。因此我對ConfigParser,ConfigObj,PyYaml和JSON做了一些閱讀。目前我對ConfigObj和PyYaml特別感興趣。然而,我還沒有設法做到我想幹淨利落地做什麼。使用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

以下應該做你想做的事情,假設我正確理解你的問題。

注意:我在覆蓋之前檢查密鑰的存在,而不是將它放在稍微不同的名稱下。

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 

雖然這工作,我真的建議你只是堅持有與他們自己的價值觀的字典。如果一個本地變量不存在,只引用一個字典有什麼問題?

+0

其實我正在使用MATLAB,但我也使用Python來獲得更多的靈活性。最終目標是將配置文件中定義的參數以MATLAB二進制格式(或mat文件)存儲。我寫的MATLAB程序使用正常的局部變量,所以我不得不離開字典。 – Aeronaelius

+0

我不太明白爲什麼這意味着你需要在Python中使用locals(),但只要你明白它不是'最佳實踐'以及風險和其他等等,並且至今。 – Logan

+0

你還建議如何將變量存儲在一個mat文件中?當然,我可以重寫我的整個MATLAB程序以不同的方式工作。但我認爲解析配置所需的腳本應該符合程序,而不是相反。 – Aeronaelius

1

如果

import __main__ 

那麼你可以

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

甚至

__main__.__dict__.update(config) 

無論是明智與否取決於你有多少值是驚訝,當你的很多全局函數被yaml條目覆蓋。