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