class BufferedFile(File): def __init__(self, file_object, mode, name=None): self.file_object = file_object self.mode = mode if 'b' in mode: self.stream = BytesIO() else: self.stream = StringIO() self.stream_size = 0 def close(self): self.file_object.close() self.stream.close() def read(self, size=None): if size is None: size = -1 if size == -1 or size > self.stream_size: while True: position = self.stream.tell() chunk = self._get_file_object_chunk() if chunk: self.stream_size += len(chunk) self.stream.write(chunk) self.stream.seek(position) if self.stream_size >= size and size != -1: break else: break if size: read_size = min(size, self.stream_size) self.stream_size -= read_size else: read_size = None return self.stream.read(read_size)