2012-04-28 19 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', 
} 

)にそれらの値を使用します

{ 

} 

1つのブロック... Groupuserとしてconsiderdがあり、 hostはユニークで反復されています。 設定ファイルを読み込んで解析し、キーと値のペアを表示する必要があります.Plsヘルプ。

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'が設定ファイルにある方法ですか、あるいはここで部分的に複製されていますか? –

+0

こんにちは、それは設定ファイルにあります... – ags

答えて

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によって解釈されるビット不正な形式であるがあります。 data.replace("=>",":")

  • 引用すべてのキー::re.sub(" (\w+) ",r"'\1'",data.replace("=>",":"))
  • あなたはその後、ast.literal_evalにそれを養うことができますので、

    1. 変更に:=>のすべての出現を、それを解釈する前に、プロセスごとにデータを持っているでしょう

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

    あなたのレスポンスに感謝します。ファイルを解析するためのast.literal_eval関数の使い方を簡単に説明してください。 "eval \ @tmp"のようなperlで@ config(configはconfigファイルの内容を持っていました)..先程ありがとう.. – ags

    2

    http://docs.python.org/library/configparser.html

    これを試してみたいです。

    しかし、あなたの設定ファイルのフォーマットは、より多くのiniファイル形式に変更したいと思うでしょう

    [section] 
    key = value 
    

    http://deron.meranda.us/python/demjson/

    demjsonも、Pythonのオブジェクトのための素晴らしいです - >文字列とバック。

    私はこのような状況でこれらを使用する傾向があります。

    関連する問題