code: def read_perseus(path_or_file, **kwargs):
      
      annotations = read_annotations(path_or_file, separator)
      column_index = create_column_index(annotations)
      if 'usecols' in kwargs:
  	    usecols = kwargs['usecols']
  	    if type(usecols[0]) is str:
  		    usecols = sorted([list(column_index).index(x) for x in usecols])
  	    column_index = column_index[usecols]
      kwargs['dtype'] = dict(kwargs.get('dtype', {}), **annotations.get('dtype', {}))
      kwargs['converters'] = dict(kwargs.get('converters', {}), **annotations.get('converters', {}))
      df = pd.read_csv(path_or_file, sep=separator, comment='#', **kwargs)
      df.columns = column_index
      return df
docs: Read a Perseus-formatted matrix into a pd.DataFrame.
      Annotation rows will be converted into a multi-index.
  
      By monkey-patching the returned pd.DataFrame a `to_perseus`
      method for exporting the pd.DataFrame is made available.
  
      :param path_or_file: File path or file-like object
      :param kwargs: Keyword arguments passed as-is to pandas.read_csv
      :returns: The parsed data frame