'Returns an iterator over the data file.'

def __iter__(self):

    try:
        dropped_cache = 0
        self._bytes_read = 0
        self._started_at_0 = False
        self._read_to_eof = False
        self._init_checks()
        while True:
            chunk = self._fp.read(self._disk_chunk_size)
            if chunk:
                self._update_checks(chunk)
                self._bytes_read += len(chunk)
                if ((self._bytes_read - dropped_cache) > DROP_CACHE_WINDOW):
                    self._drop_cache(self._fp.fileno(), dropped_cache, (self._bytes_read - dropped_cache))
                    dropped_cache = self._bytes_read
                (yield chunk)
            else:
                self._read_to_eof = True
                self._drop_cache(self._fp.fileno(), dropped_cache, (self._bytes_read - dropped_cache))
                break
    finally:
        if (not self._suppress_file_closing):
            self.close()
