Python 需要基于配置文件中的键获取值的帮助吗
我有一个包含类似数据的文件Python 需要基于配置文件中的键获取值的帮助吗,python,regex,linux,awk,sed,Python,Regex,Linux,Awk,Sed,我有一个包含类似数据的文件 [xxx] name = xxx address = bangalore [yyy] name = yyy address = sjc 请帮助我获取一个正则表达式,我可以根据xxx或yyy(xxx或yyy和地址或名称是输入)获取地址/名称值。如果您的文件与此类似,您可以使用awk执行类似操作(即名称与节相同,并且在地址之前): 或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出: $ awk -v sec='yyy' -v key=
[xxx]
name = xxx
address = bangalore
[yyy]
name = yyy
address = sjc
请帮助我获取一个正则表达式,我可以根据xxx或yyy(xxx或yyy和地址或名称是输入)获取地址/名称值。如果您的文件与此类似,您可以使用
awk
执行类似操作(即名称与节相同,并且在地址之前)
:
或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出:
$ awk -v sec='yyy' -v key='address' '
BEGIN{
FS=" *= *"
pat=sprintf("^\\[%s\\]", sec)}
$0 ~ pat {secin=$1; next}
NF==2 && $1==key && secin ~ pat {print $2; exit}' file
sjc
如果要收集所有节及其键/值对,可以(使用gawk
)执行以下操作:
Config或.ini文件可以像csv一样使用引号,因此最好使用完整的配置文件解析器。您可以使用或具有健壮的库来解析.ini或配置类型文件
Python示例:
#!/usr/bin/python
import ConfigParser
config = ConfigParser.ConfigParser()
config.read("/tmp/file")
然后,您可以抓取部分、每个部分中的项目或特定部分中的特定项目:
>>> config.sections()
['xxx', 'yyy']
>>> config.items("yyy")
[('name', 'yyy'), ('address', 'sjc')]
>>> config.get("xxx", "address")
'bangalore'
如果您的文件就是这样(即,名称
与节相同,并且位于地址
之前),则可以使用awk
执行类似操作:
或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出:
$ awk -v sec='yyy' -v key='address' '
BEGIN{
FS=" *= *"
pat=sprintf("^\\[%s\\]", sec)}
$0 ~ pat {secin=$1; next}
NF==2 && $1==key && secin ~ pat {print $2; exit}' file
sjc
如果要收集所有节及其键/值对,可以(使用gawk
)执行以下操作:
Config或.ini文件可以像csv一样使用引号,因此最好使用完整的配置文件解析器。您可以使用或具有健壮的库来解析.ini或配置类型文件
Python示例:
#!/usr/bin/python
import ConfigParser
config = ConfigParser.ConfigParser()
config.read("/tmp/file")
然后,您可以抓取部分、每个部分中的项目或特定部分中的特定项目:
>>> config.sections()
['xxx', 'yyy']
>>> config.items("yyy")
[('name', 'yyy'), ('address', 'sjc')]
>>> config.get("xxx", "address")
'bangalore'
雷格克斯来营救
这种方法将条目拆分为单个元素,然后解析键值对。最后,您只需向结果字典查询ie.值['xxx']
看
重新导入
string=”“”
[xxx]
name=xxx
地址=班加罗尔
[yyy]
name=yyy
地址=sjc
"""
rx_项=重新编译(r''
^\[(?P[^][]*)\]
.*?
(?=^\[[^][]*\]$\Z)
'',re.X | re.M | re.DOTALL)
rx_value=re.compile(r'^(?P\w+)\s*=\s*(?P.+)$),re.MULTILINE)
值={item.group('name'):{
m、 组('key'):m.group('value'))
对于rx_value.finditer(item.group(0))中的m
对于rx_item.finditer中的项(字符串)
}
打印(值)
#{'xxx':{'name':'xxx','address':'bangalore'},'yyy':{'name':'yyy','address':'sjc'}
Regex救命
这种方法将条目拆分为单个元素,然后解析键值对。最后,您只需向结果字典查询ie.值['xxx']
看
重新导入
string=”“”
[xxx]
name=xxx
地址=班加罗尔
[yyy]
name=yyy
地址=sjc
"""
rx_项=重新编译(r''
^\[(?P[^][]*)\]
.*?
(?=^\[[^][]*\]$\Z)
'',re.X | re.M | re.DOTALL)
rx_value=re.compile(r'^(?P\w+)\s*=\s*(?P.+)$),re.MULTILINE)
值={item.group('name'):{
m、 组('key'):m.group('value'))
对于rx_value.finditer(item.group(0))中的m
对于rx_item.finditer中的项(字符串)
}
打印(值)
#{'xxx':{'name':'xxx','address':'bangalore'},'yyy':{'name':'yyy','address':'sjc'}
不清楚您是要搜索方括号内的值还是“name”标记的值,但以下是对您的问题的一种可能解释的解决方案:
$ cat tst.awk
BEGIN { FS=" *= *" }
!NF { next }
NF<2 { prt(); k=$0 }
{ map[$1] = $2 }
END { prt() }
function prt() { if (k=="["key"]") print map[tag]; delete map }
$ awk -v key='yyy' -v tag='address' -f tst.awk file
sjc
$ awk -v key='xxx' -v tag='address' -f tst.awk file
bangalore
$ awk -v key='xxx' -v tag='name' -f tst.awk file
xxx
$cat tst.awk
开始{FS=“*=*”}
!NF{next}
NF不清楚您是否试图搜索方括号内的值或“name”标记的值,但以下是对您的问题的一种可能解释的解决方案:
$ cat tst.awk
BEGIN { FS=" *= *" }
!NF { next }
NF<2 { prt(); k=$0 }
{ map[$1] = $2 }
END { prt() }
function prt() { if (k=="["key"]") print map[tag]; delete map }
$ awk -v key='yyy' -v tag='address' -f tst.awk file
sjc
$ awk -v key='xxx' -v tag='address' -f tst.awk file
bangalore
$ awk -v key='xxx' -v tag='name' -f tst.awk file
xxx
$cat tst.awk
开始{FS=“*=*”}
!NF{next}
NF使用编程语言(如PHP
或Python
)更容易做到这一点,这是可能的吗?谢谢!!请推荐python,我可以在环境中试用并更新您。使用编程语言(例如PHP
或python
)更容易做到这一点,这是可能的吗?谢谢!!请推荐python,我可以在环境中试用并更新您。