code: def _read_bytes(fp, size, error_template="ran out of data"):
      """
      Read from file-like object until size bytes are read.
      Raises ValueError if not EOF is encountered before size bytes are read.
      Non-blocking objects only supported if they derive from io objects.
  
      Required as e.g. ZipExtFile in python 2.6 can return less data than
      requested.
      """
      data = bytes()
      while True:
          # io files (default in python3) return None or raise on
          # would-block, python2 file will truncate, probably nothing can be
          # done about that.  note that regular files can't be non-blocking
          try:
              r = fp.read(size - len(data))
              data += r
              if len(r) == 0 or len(data) == size:
                  break
          except io.BlockingIOError:
              pass
      if len(data) != size:
          msg = "EOF: reading %s, expected %d bytes got %d"
          raise ValueError(msg % (error_template, size, len(data)))
      else:
          return data
  
imports: from __future__ import division, absolute_import, print_function
  import numpy
  import sys
  import io
  import warnings
  from numpy.lib.utils import safe_eval
  from numpy.compat import asbytes, asstr, isfileobj, long, os_fspath
  from numpy.core.numeric import pickle
label_desc: Use image node_id 17 for calling a global function with example usage: _read_bytes(fp, size, error_template) and returns: data