Сохранение ввода файла в словарь

Я написал небольшую программу на 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 ответ
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_'])

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *