def _read_at_into()

in alibabacloud_oss_v2/filelike.py [0:0]


    def _read_at_into(self, offset, buf):
        """Read data into *buf*"""
        if offset >= self._size_in_bytes:
            return 0

        if not isinstance(buf, memoryview):
            buf = memoryview(buf)
        if buf.nbytes == 0:
            return 0
        buf = buf.cast('B')
        written = 0
        while written < len(buf):
            chunk = self._next_chunk(offset + written)
            if chunk is None:
                continue
            # eof
            if chunk == b'':
                break
            remains = len(buf) - written
            n = min(remains, len(chunk))
            buf[written:written + n] = chunk[:n]

            # Save the extra data in the buffer.
            if n < len(chunk):
                self._read_buf = chunk[n:]
                rn = len(self._read_buf)
                self._read_buf_offset -= rn
                self._seq_read_amount -= rn

            written += n
        return written