Извлечение строк из файла, вонючий способ


У меня есть участок кода, который я использую для извлечения журнала событий из большого текстового файла. Он хорошо работает, это просто мое использование списка(модуле itertools.takewhile(...)) , что чувствует себя не очень приятно для меня.

Есть ли лучше способ сделать это?

import itertools

testdata = '''
Lots of other lines...
Really quite a few.

*************
* Event Log *
*************
Col1  Col2  Col3
----- ----- -----
1     A     B
2     A     C
3     B     D

Other non-relevant stuff...
'''

def extractEventLog(fh):
    fhlines = (x.strip() for x in fh)
    list(itertools.takewhile(lambda x: 'Event Log' not in x, fhlines))
    list(itertools.takewhile(lambda x: '-----' not in x, fhlines))
    lines = itertools.takewhile(len, fhlines) # Event log terminated by blank line
    for line in lines:
        yield line # In the real code, it's parseEventLogLine(line)

Ожидаемые результаты:

>>> list(extractEventLog(testdata.splitlines()))
['1     A     B', '2     A     C', '3     B     D']


583
3
задан 18 марта 2011 в 08:03 Источник Поделиться
Комментарии
1 ответ

Да, это действительно немного отрывочны/сбивает с толку, чтобы использовать takewhile , когда вы действительно не хотите, чтобы сесть на автобус, но выбросьте их. Я думаю, что лучше использовать dropwhile и затем использовать его возвращаемое значение, а не отбрасывает их. Я считаю, что это отражает намерение гораздо более четко:

def extractEventLog(fh):
fhlines = (x.strip() for x in fh)
lines = itertools.dropwhile(lambda x: 'Event Log' not in x, fhlines)
lines = itertools.dropwhile(lambda x: '-----' not in x, lines)
lines.next() # Drop the line with the dashes
lines = itertools.takewhile(len, lines) # Event log terminated by blank line
for line in lines:
yield line # In the real code, it's parseEventLogLine(line)

6
ответ дан 18 марта 2011 в 08:03 Источник Поделиться