I try to write an iterator class:

class FileIterator(object):
    def __init__(self,file_object):
        self.fin = file_object
        # other initialization code here ...
    def __iter__(self):
        return self
    def next(self):
# special code that reads from the file and converts to Pythonic data...

This iterator I want to use with regular binary file objects. My requirement is to be able to create many iterators for the same file object, and use them from many threads - which is not straightforward. Of course I do not want to save file positions in the iterators, use locking on the file, and call seek() every time I need to read from the file. Instead of that, I try to re-open the file for each iteator. The trivial way to do it is:

class FileIterator(object):
    def __init__(self,file_object):
        self.fin = open(file_object.name,"rb")
        self.fin.seek(file_object.tell())
    ...

However, it won't work for temporary files. Temporary files are just file-like objects, and their name is '<fdopen>'. I guess I could open a temporary file with os.open, and then use os.dup, but that is low level stuff. Then I have to use os.* methods, and the file object won't be iterable. tempfile.NamedTempFile is not better, because it cannot be reopened under Windows.

So the question is, how do I create my iterator so that:

   * under Windows and Unix
   * many iterators can be used for the same underlying file, from many
     threads
   * with a normal binary file
   * and also with temporary files

A workaround would be to create a temporary directory, and then create real files inside the temporary directory. If there is no better way to do it, I'll do that.

Thanks

   Laszlo


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to