Строка поиска файла Python и возвращает определенное количество строк после совпадения - PullRequest
1 голос
/ 22 июня 2011

У меня есть текстовый файл, в котором есть строки, представляющие некоторые наборы данных. Сам файл довольно длинный, но он содержит определенные разделы следующего формата:

Series_Name                INFO Number of teams : n1
|    Team                                      |     #     |    wins     |
|    TeamName1                                 |     x     |    y        |
.
.
.
|    TeamNamen1                                |     numn  |    numn     |
Some Irrelevant lines
Series_Name2               INFO Number of teams : n1
|    Team                                      |     #     |    wins     |
|    TeamName1                                 |     num1  |    num2     |
.

где каждый раздел имеет заголовок, который начинается с Series_Name. Каждое Series_Name отличается. Строка с заголовком также включает количество команд в этой серии, n1. Следующая строка заголовка представляет собой набор строк, представляющих таблицу данных. Для каждой серии в таблице есть n1 + 1 ряд, где в каждой строке указано имя отдельной команды и соответствующая статистика. Я пытался реализовать функцию, которая позволит пользователю искать имя команды, а затем распечатывать строку в таблице, связанной с этой командой. Тем не менее, определенные названия команд отображаются в нескольких сериях. Чтобы решить эту проблему, в настоящее время я пытаюсь написать свой код, чтобы пользователь мог сначала найти строку заголовка с названием серии, а затем распечатать только следующие n1 + 1 строки, которые представляют данные, связанные с серией. Вот что я придумала до сих пор:

import re
print
fname = raw_input("Enter filename: ")
seriesname = raw_input("Enter series: ")

def findcounter(fname, seriesname):
        logfile = open(fname, "r")

        pat = 'INFO Number of teams :'

        for line in logfile:
                if seriesname in line:
                    if pat in line:
                            s=line

        pattern = re.compile(r"""(?P<name>.*?)     #starting name
                             \s*INFO        #whitespace and success
                             \s*Number\s*of\s*teams  #whitespace and strings
                             \s*\:\s*(?P<n1>.*)""",re.VERBOSE)
        match = pattern.match(s)


        name = match.group("name")
        n1 = int(match.group("n1"))
        print name + " has " + str(n1) + " teams"
        lcount = 0

        for line in logfile:
                if line.startswith(name):
                        if pat in line:
                                while lcount <= n1:
                                        s.append(line)
                                        lcount += 1
                                        return result

Первая часть моего кода работает; он соответствует строке заголовка, которую ищет человек, анализирует строку и затем выводит количество команд в этой серии. Поскольку строка заголовка в основном говорит мне, сколько строк в таблице, я подумал, что смогу использовать эту информацию для создания цикла, который будет продолжать печатать каждую строку, пока счетчик набора не достигнет n1. Но я попытался запустить его, и я понимаю, что способ, которым я его настроил, пока не верен. Итак, вот мой вопрос: как вы возвращаете количество строк после совпавшей строки, если дано количество нужных строк, следующих за совпадением? Я новичок в программировании, и я прошу прощения, если этот вопрос кажется глупым. Я работал над этим довольно усердно, без удачи, и был бы признателен за любую помощь.

1 Ответ

3 голосов
/ 22 июня 2011

Попробуйте что-то вроде этого (слегка псевдокод).

with open('myfile') as fh:
  for line in fh:
    if line == match: # Some actual code here in your conditional:
      for i in range(5):
        additionalData = next(fh)

Вызвав next (fh), вы можете получить следующую строку в файле, не испортив цикл for line in fh.

...