1

我是 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',
} 

)

每个

{

}

被认为是一个块.. Group, user,host是唯一的并且是重复的。我必须阅读和解析配置文件并显示键值对。请帮助。

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,等等。

4

3 回答 3

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

现在你有两个问题:)

于 2012-04-28T15:34:13.973 回答
2

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

你想为此尝试一下。

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

[section]
key = value

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

demjson 也适用于 python 对象 -> 字符串和返回。

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

于 2012-04-30T00:01:41.730 回答
2

您的数据格式不正确,无法由 Python 直接解释。因此,您必须在解释数据之前对其进行处理

  1. 将所有 Occurrence 更改=>: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("=>",":")))
于 2012-04-28T15:39:28.630 回答