2012-04-28 66 views
1

我是python的新手。如何從cfg文件中檢索鍵值對

我有一個配置文件,如下所示,在相同的順序。我需要檢索從配置文件鍵,值對,將在我的腳本

# Name and details 
( 
{ group => 'abc', 
    host => 'pqr.com', 
    user => 'anonymous', 
    src => '/var/tmp', 
    dest => '/tmp', 
}, 
{ group => 'abc', 
    host =>'pqr.com', 
    user => 'anonymous', 
    src => '/tmp' 
    dest => '/var/tmp' 
}, 
{ group => 'pqr', 
    host =>'abc.com', 
    user => 'xyz', 
    src => '/home/pp', 
    dest => '/var/tmp', 
}, 
{ group => 'xyz', 
    host =>'p.com', 
    user => 'x', 
    src => '/home/', 
    dest => '/tmp', 
} 

)使用這些值

每個

{ 

} 

是considerd作爲一個塊.. Groupuserhost是獨特的以及重複。 我必須閱讀和解析配置文件,並顯示鍵和值對。請幫助。

Key : group,Value : 'abc'(say) 
key : host ,Value :'pqr.com' 
Key : user, Value :'anonymous' 
Key : src,Value :'/var/tmp', 
key : dest,Value : '/tmp' 

謝謝


我已經寫,其顯示的鍵和值服用CFG文件(如上所示)作爲輸入的代碼。

idx = 0 
dictList = [] 
while True: 
try: 
start = config.index("{", idx) 
end = config.index("}", start+1) 
slice = config[start+1:end-1] 
sliceList = [s.strip() for s in slice.split(",") if s.strip()] 
dd = {} 
for item in sliceList: 
key, value = [s.strip() for s in item.split("=>")] 
print key, value 

輸出同時顯示鍵,值

key 'value' 
group 'abc' 
host 'pqr.com' 
user 'ananymous' 
src '/use/tmp 

現在的問題是,如何顯示對應於鍵的值。 例如:打印組 - 應顯示abc 打印主機應顯示pqr.com,等等。

+0

是這樣的組'abc'是在配置文件中還是部分重複在這裏? – 2012-04-28 15:29:51

+0

嗨,它是在配置文件中... – ags 2012-04-29 02:30:50

回答

3

你可能需要解析它,下面是一個關於如何做到這一點的小例子。

import re 
def parse(data): 
    '''Parse data block, return itertator on objects inside''' 
    for block in re.finditer('{[^}]*}', data, re.M): # Split to objects 
     obj = {} 
     for match in re.finditer("([a-z]+) => '([^']*)'", block.group()): 
      obj[match.group(1)] = match.group(2) 
     yield obj 

現在你有兩個問題:)

2

你的數據是有點畸形由Python的直接解釋。所以,你必須每個進程中的數據解釋它

  1. 變化=>:的一切發生之前:data.replace("=>",":")
  2. 引用的所有鍵:re.sub(" (\w+) ",r"'\1'",data.replace("=>",":"))

然後,您可以將其提供給ast.literal_eval

import re,ast 
ast.literal_eval(re.sub(" (\w+) ",r"'\1'",data.replace("=>",":"))) 
+0

感謝您的回覆。請你簡單解釋一下如何使用ast.literal_eval函數解析文件。我在perl中做了如「eval \ @tmp」= @config(其中配置有配置文件的內容)..在此先感謝.. – ags 2012-05-02 02:28:28