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

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

============================= 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

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

Думаю, вы правильно определили свою проблему (f.next() выскакивает, а не смотрит). Если ваш файл не слишком большой, вы можете прочитать его все в памяти (например, в виде списка lines) и проверить lines[linenum+1]. В качестве альтернативы вы можете установить флаг, когда найдете «==== Condition 1 ====», а затем на следующей итерации убедитесь, что присутствуют и флаг, и «условие 2». Я бы предпочел первый вариант для всех, кроме самых больших входных файлов, это приведет к более чистому коду, ИМХО.

jedwards 01.05.2018 17:28

Возможный дубликат Анализ текстовых файлов

quamrana 01.05.2018 17:30

@jedwards идея флага сработала, большое вам спасибо :)

wonder 01.05.2018 18:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
1

Ответы 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

Другие вопросы по теме