помогите дописать парсер текстового файла с помощью генератора

Iceforest

Новичок
Пользователь
Дек 14, 2020
6
1
1
нужно в функции run с помощью yield выводить значения предыдущей строки и счетчика, принтом получается, а как сделать с помощью yield не понимаю. Принт закомментил

Python:
class Parser:



    def __init__(self, file_name):

        self.file_name = file_name

        self.dates = {}

        self.j = 17

        self.date_str = ''

        self.prev = None

        self.i = 0



    def parse_file(self):

        with open(self.file_name, 'r', encoding='utf-8') as file:

            yield from file



    def filter_line(self, line):

        if 'NOK' in line:

            return line



    def get_date(self, line):

        try:

            self.date_str = line[1:self.j]

        except AttributeError:

            return None

        except ValueError:

            return None

        return self.date_str



    def run(self):

        generator = self.parse_file()

        count = 1

        prev = None

        while True:

            try:

                line = next(generator)

            except StopIteration:

                if self.get_date(prev):

                    print(self.get_date(prev), ' NOK ' + str(count) + '\n')

                break

            if self.filter_line(line):

                if prev is None:

                    if self.get_date(line):

                        prev = line

                else:

                    if self.get_date(line):

                        if self.get_date(line) == self.get_date(prev):

                            count += 1

                            prev = line

                        else:

                            # print(self.get_date(prev) + ' NOK ' + str(count) + '\n')

                            count = 1

                            prev = line

                            yield self.get_date(prev),count







file_name = 'events.txt'

parse = Parser(file_name=file_name)

parse.run()
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Код вставляйте с помощью ... -> код -> python.
Без отступов трудно в нем разбираться.
 
  • Мне нравится
Реакции: Iceforest

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
нужно в функции run с помощью yield выводить значения предыдущей строки и счетчика, принтом получается, а как сделать с помощью yield не понимаю. Принт закомментил
yield возвращает значение из функции-генератора, в консоль он не выводит. Вывести значение в консоль только с помощью yield не получится.
Возможно в задании имелось ввиду что использовать yield для чтения файла - это уже реализовано у вас в функции parse_file.
 

Iceforest

Новичок
Пользователь
Дек 14, 2020
6
1
1
yield возвращает значение из функции-генератора, в консоль он не выводит. Вывести значение в консоль только с помощью yield не получится.
Возможно в задании имелось ввиду что использовать yield для чтения файла - это уже реализовано у вас в функции parse_file.
в задание вот так написано
пример использования:
#
# grouped_events = <создание итератора/генератора> # Итератор или генератор? выбирайте что вам более понятно
# for group_time, event_count in grouped_events:
# print(f'[{group_time}] {event_count}')
#
# на консоли должно появится что-то вроде
#
# [2018-05-17 01:57] 1234
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример возврата из функции предыдущей строки и ее номера через yield:
Python:
class Parser:
    def __init__(self, file_name):
        self.file_name = file_name

    def parse_file(self):
        with open(self.file_name, "r", encoding="utf-8") as file:
            yield from file

    def run(self):

        generator = self.parse_file()
        count = 1
        prev = None

        while True:
            try:
                line = next(generator)
                if prev is not None:
                    yield count, line
                    count += 1

                else:
                    prev = line

            except StopIteration:
                break


file_name = "events.txt"
parse = Parser(file_name=file_name)

grouped_events = parse.run()

for group_time, event_count in grouped_events:
    print(f'{group_time}, {event_count}')
 

Iceforest

Новичок
Пользователь
Дек 14, 2020
6
1
1
по вашему примеру, написал, все получилось)
 

Форум IT Специалистов