code: def read(filename, attrs=None):
      
      filename = os.path.abspath(os.path.expanduser(filename))
      ext = get_ext(filename)
  
      # From the extension, decide which reader to use
      if attrs is not None:
          reader = get_reader(filename)
          return standard_reader_routine(reader, filename, attrs=attrs)
      elif ext in '.vti': # ImageData
          return vtki.UniformGrid(filename)
      elif ext in '.vtr': # RectilinearGrid
          return vtki.RectilinearGrid(filename)
      elif ext in '.vtu': # UnstructuredGrid
          return vtki.UnstructuredGrid(filename)
      elif ext in ['.ply', '.obj', '.stl']: # PolyData
          return vtki.PolyData(filename)
      elif ext in '.vts': # StructuredGrid
          return vtki.StructuredGrid(filename)
      elif ext in ['.vtm', '.vtmb']:
          return vtki.MultiBlock(filename)
      elif ext in ['.e', '.exo']:
          return read_exodus(filename)
      elif ext in ['.vtk']:
          # Attempt to use the legacy reader...
          return read_legacy(filename)
      else:
          # Attempt find a reader in the readers mapping
          try:
              reader = get_reader(filename)
              return standard_reader_routine(reader, filename)
          except KeyError:
              pass
      raise IOError("This file was not able to be automatically read by vtki.")
docs: This will read any VTK file! It will figure out what reader to use
      then wrap the VTK object for use in ``vtki``.
  
      Parameters
      ----------
      attrs : dict, optional
          A dictionary of attributes to call on the reader. Keys of dictionary are
          the attribute/method names and values are the arguments passed to those
          calls. If you do not have any attributes to call, pass ``None`` as the
          value.