'Read up to n bytes with at most one read() system call.'

def read1(self, n):

    if ((n < 0) or (n is None)):
        n = self.MAX_N
    len_readbuffer = (len(self._readbuffer) - self._offset)
    if ((self._compress_left > 0) and (n > (len_readbuffer + len(self._unconsumed)))):
        nbytes = ((n - len_readbuffer) - len(self._unconsumed))
        nbytes = max(nbytes, self.MIN_READ_SIZE)
        nbytes = min(nbytes, self._compress_left)
        data = self._fileobj.read(nbytes)
        self._compress_left -= len(data)
        if (data and (self._decrypter is not None)):
            data = ''.join(map(self._decrypter, data))
        if (self._compress_type == ZIP_STORED):
            self._update_crc(data, eof=(self._compress_left == 0))
            self._readbuffer = (self._readbuffer[self._offset:] + data)
            self._offset = 0
        else:
            self._unconsumed += data
    if ((len(self._unconsumed) > 0) and (n > len_readbuffer) and (self._compress_type == ZIP_DEFLATED)):
        data = self._decompressor.decompress(self._unconsumed, max((n - len_readbuffer), self.MIN_READ_SIZE))
        self._unconsumed = self._decompressor.unconsumed_tail
        eof = ((len(self._unconsumed) == 0) and (self._compress_left == 0))
        if eof:
            data += self._decompressor.flush()
        self._update_crc(data, eof=eof)
        self._readbuffer = (self._readbuffer[self._offset:] + data)
        self._offset = 0
    data = self._readbuffer[self._offset:(self._offset + n)]
    self._offset += len(data)
    return data
