如何从cfg文件中检索键值对

时间:2012-04-28 15:15:35

标签: python key-value

我是python的新手。

我有一个配置文件,如下所示,顺序相同。我需要从配置文件中检索键值对,并在脚本中使用这些值

# 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',
} 

每个

{

}

被视为一个块.. 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 print host应该显示pqr.com,依此类推。

3 个答案:

答案 0 :(得分: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

现在你有两个问题:)

答案 1 :(得分:2)

您的数据有点格式错误,无法由Python直接解释。因此,在解释数据之前,您必须对数据进行单处理

  1. =>的所有出现更改为:data.replace("=>",":")
  2. 引用所有密钥:re.sub(" (\w+) ",r"'\1'",data.replace("=>",":"))
  3. 然后,您可以将其提供给ast.literal_eval

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

答案 2 :(得分:2)

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

你想为此尝试一下。

但您的配置文件格式需要更改为更多ini格式

[section]
key = value

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

demjson对python对象也很好 - >字符串和背面。

我倾向于在这种情况下使用这些。