#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