Python:解析字段数量不一的冒号分隔文件
我正在尝试解析一些格式为 'clientname'.txt 的文件。
hostname:comp1
time: Fri Jan 28 20:00:02 GMT 2011
ip:xxx.xxx.xx.xx
fs:good:45
memory:bad:78
swap:good:34
Mail:good
每个部分是用冒号 : 来分隔的,但第0、2、6行有2个字段,而第1、3-5行则有3个或更多字段。一个我遇到的大问题是时间字段:比如20:00:02其实是一个时间,而不是3个分开的字段。
我有好几个这样的文件需要解析。其中一些文件还有更多行和多个字段。
...
for i in clients:
if os.path.isfile(rpt_path + i + rpt_ext): # if the rpt exists then do this
rpt = rpt_path + i + rpt_ext
l_count = 0
for line in open(rpt, "r"):
s_line = line.rstrip()
part = s_line.split(':')
print part
l_count = l_count + 1
else: # else break
break
首先,我会检查文件是否存在,如果存在就打开文件并解析(最终会这样做)。现在我只是打印输出(打印部分),以确保解析正确。老实说,我现在唯一遇到的问题就是时间字段。我该如何特别处理这一行,与其他行区分开来呢?时间字段在我所有的报告文件中总是位于第二行。
4 个回答
1
设计考虑:
要能很好地处理多余的空格,包括空行和缺少的冒号。
提取一个记录类型,这个类型会用来决定如何解析这一行的其余部分。
>>> def munched(s, n=None):
... if n is None:
... n = 99999999 # this kludge should not be necessary
... return [x.strip() for x in s.split(':', n)]
...
>>> def parse_line(line):
... if ':' not in line:
... return [line.strip(), '']
... record_type, remainder = munched(line, 1)
... if record_type == 'time':
... data = [remainder]
... else:
... data = munched(remainder)
... return record_type, data
...
>>> for guff in """
... hostname:comp1
... time: Fri Jan 28 20:00:02 GMT 2011
... ip:xxx.xxx.xx.xx
... fs:good:45
... memory : bad : 78
... missing colon
... Mail:good""".splitlines(True):
... print repr(guff), parse_line(guff)
...
'\n' ['', '']
'hostname:comp1\n' ('hostname', ['comp1'])
'time: Fri Jan 28 20:00:02 GMT 2011\n' ('time', ['Fri Jan 28 20:00:02 GMT 2011'])
'ip:xxx.xxx.xx.xx\n' ('ip', ['xxx.xxx.xx.xx'])
'fs:good:45\n' ('fs', ['good', '45'])
' memory : bad : 78 \n' ('memory', ['bad', '78'])
'missing colon\n' ['missing colon', '']
'Mail:good' ('Mail', ['good'])
>>>
2
split方法的用法是这样的:split( [sep [,maxsplit]])
。如果你给了maxsplit这个参数,它会把字符串分成maxsplit+1个部分。在你的情况下,只需要把maxsplit设置为1就可以了。只要用split(':',1)
就能解决你的问题。
1
如果time
是一个特殊情况,你可以这样做:
[...]
s_line = line.rstrip()
if line.startswith('time:'):
part = s_line.split(':', 1)
else:
part = s_line.split(':')
print part
[...]
这样做会给你:
['hostname', 'comp1']
['time', ' Fri Jan 28 20:00:02 GMT 2011']
['ip', 'xxx.xxx.xx.xx']
['fs', 'good', '45']
['memory', 'bad', '78']
['swap', 'good', '34']
['Mail', 'good']
而且这个方法不依赖于time
在文件中的位置。