我早些时候发布了这个问题Approach for parsing file and creating dynamic data structure for use by another program,并得到了一些很好的建议。
所以现在我有一些工作,我想看看是否有更好的方法。
背景资料:
我基本上需要解析一个我目前无法修改的静态属性文件。从中读取一些值并将其放入一个数据结构中,我可以在一些我可以控制的脚本中使用它。我面临的问题是我想将“喜欢”键/值组合在一起,以便我可以稍后在我的脚本中循环访问它们。例如,我的属性文件实际上看起来像这样。
somerandom.propname=value1
myhostname.APP_HOME=c:\\apps\\apphome
myhostname.DomainName=sampleDomain
myhostname.data.dir=D:\\data\\
sampleDomain.host=myhostname
sampleDomain.port=80
sampleDomain.sslport=443
sampleDomain.ClusterManagedServer1.port=8080
sampleDomain.ClusterManagedServer2.port=8012
sampleDomain.ClusterManagedServer1.sslport=8021
sampleDomain.ClusterManagedServer2.sslport=8022
sampleDomain.ClusterManagedServer1.name=MS1
sampleDomain.ClusterManagedServer2.name=MS2
sampleDomain.ClusterManagedServer1.host=myhostname
sampleDomain.ClusterManagedServer2.host=myHOST2
sampleDomain.ClusterManagedServer3.port=8031
sampleDomain.ClusterManagedServer4.port=8042
sampleDomain.ClusterManagedServer3.sslport=8043
sampleDomain.ClusterManagedServer4.sslport=8053
sampleDomain.ClusterManagedServer3.name=MS3
sampleDomain.ClusterManagedServer4.name=MS4
sampleDomain.ClusterManagedServer3.host=myhostHOST3
sampleDomain.ClusterManagedServer4.host=myhostHOST4
sampleDomain.AdminAccount=samplesuperadmin
sampleDomain.ServerName=myhostname222
sampleDomain.ServerPort=8008
sampleDomain.HeapSize=1234m
somerandom.propname=value2
anotherhostname.APP_HOME=c:\\apps\\apphome
anotherhostname.DomainName=sampleDomain
anotherhostname.data.dir=D:\\data\\
testDomain.host=anotherhostname
testDomain.port=80
testDomain.sslport=443
testDomain.ClusterManagedServer1.port=8080
testDomain.ClusterManagedServer2.port=8012
testDomain.ClusterManagedServer1.sslport=8021
testDomain.ClusterManagedServer2.sslport=8022
testDomain.ClusterManagedServer1.name=MS1
testDomain.ClusterManagedServer2.name=MS2
testDomain.ClusterManagedServer1.host=anotherhostname
testDomain.ClusterManagedServer2.host=anotherHOST2
testDomain.ClusterManagedServer3.port=8031
testDomain.ClusterManagedServer4.port=8042
testDomain.ClusterManagedServer3.sslport=8043
testDomain.ClusterManagedServer4.sslport=8053
testDomain.ClusterManagedServer3.name=MS3
testDomain.ClusterManagedServer4.name=MS4
testDomain.ClusterManagedServer3.host=anotherHOST3
testDomain.ClusterManagedServer4.host=anotherHOST4
testDomain.AdminAccount=superadminaccount
testDomain.ServerName=myservernamehere
testDomain.ServerPort=80
testDomain.HeapSize=1355m
所以我要做的是匹配“ClusterManagedServer#”的所有值,其中#=数字到某个结构中,所以我可以通过它循环,并为每个主机配置名称,端口等。
我有以下代码工作(只是一个概念证明),我必须使用早期版本的python附带的现有模块,所以我无法下载任何模块并安装它们。
import re
from socket import gethostname
class Ddict(dict):
def __init__(self, default=None):
self.default = default
def __getitem__(self, key):
if not self.has_key(key):
self[key] = self.default()
return dict.__getitem__(self, key)
propertyfile_name = 'SystemConfig.properties'
hname=gethostname()
print 'hostname is', hname
print '\ngetting domainname\n'
RE4 =(hname+'.DomainName=(\S+)(?:\s+|\Z)')
with open(propertyfile_name) as f:
for (x) in re.findall(RE4,f.read()):
dName=x
print 'domain name is: ',dName
RE = (dName+'.ClusterManagedServer(\d+)\.host=(\S+)(?:\s+|\Z)')
RE1 =(dName+'.ClusterManagedServer(\d+)\.name=(\S+)(?:\s+|\Z)')
RE2 =(dName+'.ClusterManagedServer(\d+)\.sslport=(\d+)\s+' )
RE3 =(dName+'.ClusterManagedServer(\d+)\.port=(\d+)\s+' )
dico = Ddict( dict )
print '\n\nGetting values from property file:'
with open(propertyfile_name) as f:
for (server,h) in re.findall(RE,f.read()):
dico[server]['host']=h
with open(propertyfile_name) as f:
for (server,n) in re.findall(RE1,f.read()):
dico[server]['name']=n
#print dico
with open(propertyfile_name) as f:
for (server,s) in re.findall(RE2,f.read()):
dico[server]['sslport']=s
#print dico
with open(propertyfile_name) as f:
for (server,p) in re.findall(RE3,f.read()):
dico[server]['port']=p
#print dico
#print '\ndico is:'
#print dico
print '\n**for loop to print out values in dictionary **\n'
keys = dico.keys()
keys.sort()
for k in keys:
print '\n'
#print k
#print dico[k]
print dico[k]['name']
print dico[k]['sslport']
print dico[k]['host']
print dico[k]['port']
print '\n'
我的问题是,是否有更好的方法来解析文件并获得我需要的内容而不必打开文件4次以获取特定值?
由于
答案 0 :(得分:0)
with open(propertyfile_name) as f:
content= f.read()
for (server,h) in re.findall(RE,content):
dico[server]['host']=h
for (server,n) in re.findall(RE1,content):
dico[server]['name']=n
for (server,s) in re.findall(RE2,content):
dico[server]['sslport']=s
for (server,p) in re.findall(RE3,content):
dico[server]['port']=p