我是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 print host应该显示pqr.com,依此类推。
答案 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直接解释。因此,在解释数据之前,您必须对数据进行单处理
=>
的所有出现更改为:
:data.replace("=>",":")
re.sub(" (\w+) ",r"'\1'",data.replace("=>",":"))
然后,您可以将其提供给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对象也很好 - >字符串和背面。
我倾向于在这种情况下使用这些。