docs: def read(self, length=-1):
          """
          Read ``length`` bytes from the file.  If ``length`` is negative or
          omitted, read all data until EOF.
  
          :type length: int
          :param length: the number of bytes to read
          :rtype: string
          :return: the chunk of data read from the file
          """
          _complain_ifclosed(self.closed)
          # NOTE: libhdfs read stops at block boundaries: it is *essential*
          # to ensure that we actually read the required number of bytes.
          if length < 0:
              length = self.size
          chunks = []
          while 1:
              if length <= 0:
                  break
              c = self.f.read(min(self.buff_size, length))
              if c == b"":
                  break
              chunks.append(c)
              length -= len(c)
          data = b"".join(chunks)
          if self.__encoding:
              return data.decode(self.__encoding, self.__errors)
          else:
              return data