Разбор файла при выполнении нескольких условий в последовательных строках

Я пытаюсь разобрать текстовый файл с данными, как показано ниже:

============================= condition 1 ============================

condition 2 string

col 1 col2 tags
------------------------------
      xx xx abc
      xx xx ac

col4 col 1       col5 col6        col7       col8     col9      col10     col11        col12   col13
-----------------------------------------------------------------------------------------------------
     1  11        6    30         abc        text    -2794      682         57388      294      210
     2  11        6    30         ac         text    -2447      680         52973      302      214
     3  11        13                         text    -2619     -805        120956      568      255
     4  11        16                         text     2185    -1261        116983      548      273
     5  11        17                         text    -3362    -1413        127136      569      278

Criterion 30 : xxxxx         text3 11 : some text here

============================================================================

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

  1. найдите условие 1 и, если оно выполнено, убедитесь, что строка условия 2 присутствует
  2. выберите значения в столбце «теги»
  3. а затем найдите эти теги в таблице ниже, чтобы извлечь информацию из столбцов с 9 по 13.

Я могу сделать третью часть, однако я борюсь с первыми двумя, так как когда я использую f.next() для проверки условия 2, это портит мой код:

with open(each_file) as f:
    copy = False
    i = 0
    for linenum,line in enumerate(f):
        if line.strip() == "============================= Condition 1 ============================":
            line_next = f.next()
            if line_next.strip() == "condition 2 string":
                print "here1"
                print line.strip()
                copy = True ## Start copying when both the conditions are met

            elif line_next.strip() == "col4 col 1       col5 col6        col7       col8     col9      col10     col11        col12   col13": ## Stop copying at this line
                if i == 0:
                    copy = False
                else:
                    copy = False
                i = i + 1

        elif copy:
            print copy
            print line

Пожалуйста, помогите мне с этим.


person wonder    schedule 01.05.2018    source источник
comment
Я думаю, вы правильно определили свою проблему (f.next() выскакивает, а не заглядывает). Если ваш файл не слишком велик, вы можете прочитать его весь в памяти (например, в виде списка lines) и проверить lines[linenum+1]. В качестве альтернативы вы можете установить флаг, когда найдете ==== Условие 1 ====, а затем на следующей итерации проверить наличие и флага, и условия 2. Я бы предпочел первый вариант для всех, кроме самых больших входных файлов, это приведет к более чистому коду, ИМХО.   -  person jedwards    schedule 01.05.2018
comment
Возможный дубликат Синтаксический анализ текстовых файлов   -  person quamrana    schedule 01.05.2018
comment
@jedwards идея с флагом сработала, большое спасибо :)   -  person wonder    schedule 01.05.2018


Ответы (1)


Это должно делать то, что вы хотите:

with open(each_file) as f:
    cond_1 = False
    copy = False
    for linenum,line in enumerate(f.readlines()):
        line = line.strip()
        #print("DEBUG: line is <{0}>".format(line))
        if line == "============================= condition 1 ============================":
            print "DEBUG: condition 1"
            cond_1 = True

        elif cond_1 and line == "condition 2 string":
            print "DEBUG: condition 2 / start copying"
            copy = True ## Start copying when both the conditions are met

        elif line == "col4 col 1       col5 col6        col7       col8     col9      col10     col11        col12   col13": ## Stop copying at this line
            print "DEBUG: stop copying"
            copy = False

        if copy:
            #print "DEBUG: Copying..."
            print line
person curusarn    schedule 01.05.2018