Найти - Пользователи
Полная версия: Конструирование генератора для построчного чтения файла с контролем положения курсора
Начало » Python для экспертов » Конструирование генератора для построчного чтения файла с контролем положения курсора
1
agryn
Не осудите но итераторами пробую пользоваться только сейчас.
Конструирую генератор для построчного чтения лог файла с возможностью контролировать позицию чтения с лога:
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() не выводит актуальное положение курсора
Подскажите как правильно сконструировать генератор с контролем положения курсора.
pyuser
Попробуйте так:
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()
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
>>> 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__
agryn
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
Кажется я этот вариант также пробовал но был в затмении. Спасибо все сработало!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB