Как я могу извлечь данные из строки под заголовком в текстовом файле

#python #file #parsing

#питон #файл #синтаксический анализ

Вопрос:

У меня есть текстовый файл, из которого мне нужно извлечь определенные данные. Нужные мне данные появятся под заголовком, начинающимся с «Нет». Так что я знаю, что искать при поиске в файле, и я могу разделить и распечатать каждый заголовок. Однако я хочу извлечь данные, которые находятся в следующей строке той, которая начинается с «Нет». Я также не могу использовать регулярные выражения. Как я могу этого добиться? Мне удалось успешно найти каждый заголовок в файле, используя приведенный ниже код, но, как уже упоминалось, я хочу получить следующую строку.

 with open(path, 'r') as f:
    for line in f:
        if KEYWORD in line:
            data = line.split()
            print(data)
 

распечатывает заголовки:

 ['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
['No.', 'Time', 'Source', 'Destination', 'Protocol', 'Length', 'Info']
 

образец текстового файла

 Internet Protocol Version 4, Src: 192.168.1.180, Dst: 239.255.255.250
    0100 .... = Version: 4
    .... 0101 = Header Length: 20 bytes (5)
    Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
    Total Length: 358
    Identification: 0xfe2a (65066)
    Flags: 0x4000, Don't fragment
    Time to live: 4
    Protocol: UDP (17)
    Header checksum: 0xc505 [validation disabled]
    [Header checksum status: Unverified]
    Source: 192.168.1.180
    Destination: 239.255.255.250
User Datagram Protocol, Src Port: 35064, Dst Port: 1900
Simple Service Discovery Protocol

No.     Time           Source                Destination           Protocol Length Info
      2 0.307821       192.168.1.180         239.255.255.250       SSDP     422    NOTIFY * HTTP/1.1 
 

Ответ №1:

Если вы пытаетесь изменить свой код как можно меньше, то вот как вы можете это сделать:

 is_next_line_needed = False
with open(path, 'r') as f:
    for line in f:
        if KEYWORD in line:
            is_next_line_needed = True
        if is_next_line_needed == True:
            data = line.split()
            print(data)
            is_next_line_needed = False
 

Ответ №2:

только следующая строка.

 KEYWORD_check = False
with open(path, 'r') as f:
    for line in f:
        if KEYWORD_check:
            data = line.split()
            print(data)
            break
        if KEYWORD in line:
            KEYWORD_check = True