Строка поиска файла Python и возвращает определенное количество строк после совпадения

1

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

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

где каждый раздел имеет заголовок, который начинается с имени_серии. Каждое имя_серии отличается. Строка с заголовком также включает количество команд в этой серии, 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. Но я попытался запустить его, и я понимаю, что способ, который я установил до сих пор, неверен. Итак, вот мой вопрос: как вы возвращаете несколько строк после согласованной строки при задании числа желаемых строк, следующих за совпадением? Я новичок в программировании, и прошу прощения, если этот вопрос кажется глупым. Я работаю над этим довольно усердно без везения и буду признателен за любую помощь.

Теги:
file
match
lines

1 ответ

2
Лучший ответ

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

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)

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

  • 0
    Спасибо за вклад! Я посмотрю, смогу ли я работать в чем-то подобном, но почему 5 используется для аргумента range ()?
  • 0
    @ Симос Андерсон - Просто предположите, сколько строк вы хотите вставить. Как я уже сказал, код не на 100% для ваших данных, это скорее концепция подхода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню