import types import os class FileAdaptor: """A FileAdaptor instance takes a 'file-like' object having at least a 'read' method and, via the file method, returns a true file object.""" def __init__(self, fileObj): self.fileObj = fileObj self.chunksize = 1024 * 10 # If the input file-like object is actually a true file object, # we don't need to do anything. if type(self.fileObj) != types.FileType: # The file-like object must have a read method. if not hasattr(fileObj, "read"): raise ValueError, "not a file-like object" # Create our true file object as a temp file. self.tmpFileObj = os.tmpfile() # Read from the input file-like object (via its read method) # in chunks so we don't chew up too much memory, and write # out to the temp file. while True: data = fileObj.read(self.chunksize) if len(data) == 0: break self.tmpFileObj.write(data) del data # Make sure the temp file is ready to be read from its start. self.tmpFileObj.flush() self.tmpFileObj.seek(0, 0) self.fileObj = self.tmpFileObj return def file(self): """Return the true file object.""" return self.fileObj