Я написал небольшую программу на Python, которая читает следующий файл и сохраняет результат в словаре. Я получаю ожидаемый результат, но думаю, что это можно сделать лучше. Я использую Python 3.
Вход
check_name : xa25
not run:
del_l6w_
dl_l4w_
dl_l22w_
de_l3w_
ckt_pw_
ckt_pw_
run:
inv_w_
buf_w_
End
Код
import collections
def main():
chk_cell = "input.txt"
chk_cell_data = collections.defaultdict(dict)
with open(chk_cell, "r") as fchk_cell:
check_name = ""
not_run_flag = False
run_flag = False
for data in fchk_cell.readlines():
data = data.strip()
if not data:
continue
if data.startswith('check_name'):
data = data.split(":")
check_name = data[1].strip()
continue
elif data.startswith('End') or '-' in data:
check_name = ""
not_run_flag = False
run_flag = False
continue
elif data.startswith('not run'):
chk_cell_data[check_name]['not_run'] = []
not_run_flag = True
continue
elif data.startswith('run'):
chk_cell_data[check_name]['run'] = []
not_run_flag = False
run_flag = True
continue
if not_run_flag:
chk_cell_data[check_name]['not_run'].append(data)
elif run_flag:
chk_cell_data[check_name]['run'].append(data)
print(chk_cell_data)
if __name__ == "__main__":
main()
1 ответ
Тип силы
Если у вас нет действительно (действительно) веской причины использовать dict
— например, планирование немедленной сериализации в JSON для некоторых сетевых операций — dict
— плохой выбор для внутреннего представления. Использовать @dataclass
.
Строгость парсинга
Вы должны быть немного строже в парсинге; ваша текущая реализация учитывает
check_name_for_something_that_makes_no_sense
быть check_name
заголовок и запись данных под run:
заголовок называется
check_name
быть заголовком, а не записью данных. Вместо этого просто сравните всю строку.
Данные вашего примера не показывают причины для вашего -
проверьте, чтобы он был там, поэтому я не вижу причин для его существования.
Состояние синтаксического анализа
Вместо того, чтобы вешать флаги для запоминания состояния синтаксического анализа, вы можете просто назначить ссылку на список, который в настоящее время заполняется.
Явная итерация
Не нужно звонить readlines
. Просто переберите сам файловый объект.
Пример реализации
from dataclasses import dataclass
from typing import TextIO, List
@dataclass
class RunData:
name: str
run: List[str]
not_run: List[str]
@classmethod
def from_file(cls, f: TextIO) -> 'RunData':
run = []
not_run = []
current_list = None
name = None
for line in f:
line = line.rstrip()
if line == 'run:':
current_list = run
elif line == 'not run:':
current_list = not_run
elif line.startswith('check_name :'):
name = line.split(': ', 1)[1]
elif line == 'End':
return cls(name, run, not_run)
else:
current_list.append(line)
def main():
chk_cell = "input.txt"
with open(chk_cell, "r") as fchk_cell:
chk_cell_data = RunData.from_file(fchk_cell)
print(chk_cell_data)
if __name__ == "__main__":
main()
отпечатки
RunData(name="xa25", run=['inv_w_', 'buf_w_'], not_run=['del_l6w_', 'dl_l4w_', 'dl_l22w_', 'de_l3w_', 'ckt_pw_', 'ckt_pw_'])