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.

def read_annotations(path_or_file, separator='\t', reset=True):
    """
    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.
    """
    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