Python: анализ файла с разделителями-двоеточиями с различным количеством полей - PullRequest
1 голос
/ 29 января 2011

Я пытаюсь проанализировать несколько файлов со следующим форматом в '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 ]

2 голосов
/ 29 января 2011

метод split имеет следующий синтаксис split( [sep [,maxsplit]]) и, если задан maxsplit, он будет составлять maxsplit + 1 часть.В вашем случае вы просто задаете maxsplit как 1. Просто split(':',1) решит вашу проблему.

1 голос
/ 29 января 2011

Особенности проектирования:

Надежная обработка посторонних пробелов, включая пустые строки и пропущенные двоеточия.

Извлечь тип записи, который затем используется, чтобы решить, как анализировать оставшуюся часть строки.

>>> 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'])
>>>
1 голос
/ 29 января 2011

Если 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 в файле.

0 голосов
/ 29 января 2011

Если в поле времени всегда 2-я строка.Почему вы не можете пропустить и разобрать его отдельно?

Что-то вроде

for i, line in enumerate(open(rpt, "r").read().splitlines()):
    if i==1: # Special parsing for time: line
        data = line[5:]
    else:
        # your normal parsing logic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...