协助重新模块脚本

时间:2011-03-18 20:53:10

标签: python

我早些时候发布了这个问题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次以获取特定值?

由于

1 个答案:

答案 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