code: def ensure_open(f, mode='r'):
      r
      fin = f
      if isinstance(f, basestring):
          if len(f) <= MAX_LEN_FILEPATH:
              f = find_filepath(f) or f
              if f and (not hasattr(f, 'seek') or not hasattr(f, 'readlines')):
                  if f.lower().endswith('.gz'):
                      return gzip.open(f, mode=mode)
                  return open(f, mode=mode)
              f = fin  # reset path in case it is the text that needs to be opened with StringIO
          else:
              f = io.StringIO(f) 
      elif f and getattr(f, 'closed', None):
          if hasattr(f, '_write_gzip_header'):
              return gzip.open(f.name, mode=mode)
          else:
              return open(f.name, mode=mode)
      return f
docs: r""" Return a file pointer using gzip.open if filename ends with .gz otherwise open()
  
      TODO: try to read a gzip rather than relying on gz extension, likewise for zip and other formats
      TODO: monkey patch the file so that .write_bytes=.write and .write writes both str and bytes
  
      >>> fn = os.path.join(DATA_PATH, 'pointcloud.csv.gz')
      >>> fp = ensure_open(fn)
      >>> fp
      <gzip _io.BufferedReader name='...src/nlpia/data/pointcloud.csv.gz' 0x...>
      >>> fp.closed
      False
      >>> with fp:
      ...     print(len(fp.readlines()))
      48485
      >>> fp.read()
      Traceback (most recent call last):
        ...
      ValueError: I/O operation on closed file
      >>> len(ensure_open(fp).readlines())
      48485
      >>> fn = os.path.join(DATA_PATH, 'mavis-batey-greetings.txt')
      >>> fp = ensure_open(fn)
      >>> len(fp.read())
      314
      >>> len(fp.read())
      0
      >>> len(ensure_open(fp).read())
      0
      >>> fp.close()
      >>> len(fp.read())
      Traceback (most recent call last):
        ...
      ValueError: I/O operation on closed file.