Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2013 17:00:22

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Не осудите но итераторами пробую пользоваться только сейчас.
Конструирую генератор для построчного чтения лог файла с возможностью контролировать позицию чтения с лога:

class LogParser:
    def __init__(self, file_name):
        self.log_file = open(file_name)
        self.where = 0L
    
    def  iter_line(self):
        while True:
            self.where = self.log_file.tell()
            raw_line = self.log_file.readline()
            if raw_line:
                yield raw_line
            else:
                raise StopIteration
При чтении через цикл - цикл не оканчивается
parser = LogParser('some.log')
for line in parser.iter_line():
    print parser.where, ' ', line
Метод чтения через xreadlines
log_file = open(file_name)
for line in log_file.xreadlines():
    print log_file.tell(), ' ', line
    
Не подходит так как log_file.tell() не выводит актуальное положение курсора
Подскажите как правильно сконструировать генератор с контролем положения курсора.

Отредактировано agryn (Май 31, 2013 17:03:34)

Офлайн

#2 Июнь 1, 2013 05:04:35

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

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

Попробуйте так:

class LogParser:
    def __init__(self, file_name):
        self.file_name = file_name
        self.where = 0L
    
    def  iter_line(self):
        with open(self.file_name, "rt", encoding="utf-8") as f:
            for line in iter(f.readline, None):
                yield line
                self.where = f.tell()



Отредактировано pyuser (Июнь 1, 2013 05:05:40)

Офлайн

#3 Июнь 1, 2013 09:37:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

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

class LogParser:
    def __init__(self, file_name):
        self.log_file = open(file_name)
        self.where = 0L
    
    def iter_line(self):
        while True:
            self.where = self.log_file.tell()
            raw_line = self.log_file.readline()
            if raw_line:
                yield raw_line
            else:
                break
>>> lp = LogParser('/etc/passwd')
>>> for line in lp.iter_line():
...   print line, lp.where
... 
root:x:0:0:root:/root:/bin/bash
0
bin:x:1:1:bin:/bin:/sbin/nologin
32
daemon:x:2:2:daemon:/sbin:/sbin/nologin
65
  ...

допишешь закрытие файла в __del__



Отредактировано py.user.next (Июнь 1, 2013 09:39:11)

Офлайн

#4 Июнь 1, 2013 11:11:07

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next
class LogParser:
    def __init__(self, file_name):
        self.log_file = open(file_name)
        self.where = 0L
    
    def iter_line(self):
        while True:
            self.where = self.log_file.tell()
            raw_line = self.log_file.readline()
            if raw_line:
                yield raw_line
            else:
                break
Кажется я этот вариант также пробовал но был в затмении. Спасибо все сработало!

Отредактировано agryn (Июнь 1, 2013 11:11:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version