code: def read_annotations(path_or_file, separator='\t', reset=True):
      
      annotations = OrderedDict({})
      with PathOrFile(path_or_file, 'r', reset=reset) as f:
          annotations['Column Name'] = f.readline().strip().split(separator)
          for line in f:
              if line.startswith('#!{'):
                  tokens = line.strip().split(separator)
                  _name, first_value = tokens[0].split('}')
                  name = _name.replace('#!{', '')
                  values = [first_value] + tokens[1:]
                  if name == 'Type':
                      colnames = annotations['Column Name']
                      annotations['dtype'] = {colnames[i]: perseus_to_dtype[x] for i, x in enumerate(values) if x in perseus_to_dtype}
                      annotations['converters'] = {colnames[i]: converters[x] for i, x in enumerate(values) if x in converters}
                  annotations[name] = values
      return annotations
docs: Read all annotations from the specified file.
      
      >>> annotations = read_annotations(path_or_file, separator)
      >>> colnames = annotations['Column Name']
      >>> types = annotations['Type']
      >>> annot_row = annotations['Annot. row name']
  
      :param path_or_file: Path or file-like object
      :param separator: Column separator
      :param reset: Reset the file after reading. Useful for file-like, no-op for paths.
      :returns: Ordered dictionary of annotations.