Barak, Ron wrote:
Hi,
I have a generator whose aim is to returns consecutive lines from a file (the listing below is a simplified version). However, as it is written now, the generator method changes the text file pointer to end of file after first invocation.
Namely, the file pointer changes from 0 to 6623 on line 24.
It might be that the generator method of self.input_file is reading the file a chunk at a time for efficiency even though it's yielding a line at a time.

Can you suggest how the generator could be changed, so it will allow me to get the current location in the file after each yield ? Thanks,
Ron.
$ cat -n generator.py # listing without line numbers is below
     1  #!/usr/bin/env python
     2
     3  import gzip
     4  from Debug import _line as line
     5
     6  class LogStream():
7 8 def __init__(self, filename):
     9          self.filename = filename
    10          self.input_file = self.open_file(filename)
    11
    12      def open_file(self, in_file):
    13          try:
    14              f = gzip.GzipFile(in_file, "r")
    15              f.readline()
    16          except IOError:
    17              f = open(in_file, "r")
    18              f.readline()
    19          f.seek(0)
    20          return(f)
    21
    22      def line_generator(self):
23 print line()+". self.input_file.tell()==",self.input_file.tell()
    24          for line_ in self.input_file:
25 print line()+". self.input_file.tell()==",self.input_file.tell()
    26              yield line_.strip()
    27
    28
    29  if __name__ == "__main__":
    30
    31      filename = "sac.log.50lines"
    32      log_stream = LogStream(filename)
    33      log_stream.input_file.seek(0)
    34      line_generator = log_stream.line_generator()
    35      line_ = line_generator.next()
$ python generator.py
23. self.input_file.tell()== 0
25. self.input_file.tell()== 6623
$ wc -c sac.log.50lines
6623 sac.log.50lines
$ cat generator.py #!/usr/bin/env python import gzip
from Debug import _line as line
class LogStream(): def __init__(self, filename):
        self.filename = filename
        self.input_file = self.open_file(filename)
def open_file(self, in_file):
        try:
            f = gzip.GzipFile(in_file, "r")
            f.readline()
        except IOError:
            f = open(in_file, "r")
            f.readline()
        f.seek(0)
        return(f)
def line_generator(self):
        print line()+". self.input_file.tell()==",self.input_file.tell()
        for line_ in self.input_file:
            print line()+". self.input_file.tell()==",self.input_file.tell()
            yield line_.strip()
if __name__ == "__main__":
filename = "sac.log.50lines"
    log_stream = LogStream(filename)
    log_stream.input_file.seek(0)
    line_generator = log_stream.line_generator()
    line_ = line_generator.next()
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to