def parse_reaction_table_file(path, f, default_compartment):
context = FilePathContext(path)<EOL>for lineno, row in enumerate(csv.DictReader(f, delimiter=str('<STR_LIT:\t>'))):<EOL><INDENT>if '<STR_LIT:id>' not in row or row['<STR_LIT:id>'].strip() == '<STR_LIT>':<EOL><INDENT>raise ParseError('<STR_LIT>')<EOL><DEDENT>props = {key: value for key, value in iteritems(row) if value != '<STR_LIT>'}<EOL>if '<STR_LIT>' in props:<EOL><INDENT>props['<STR_LIT>'] = parse_reaction_equation_string(<EOL>props['<STR_LIT>'], default_compartment)<EOL><DEDENT>mark = FileMark(context, lineno + <NUM_LIT:2>, <NUM_LIT:0>)<EOL>yield ReactionEntry(props, mark)<EOL><DEDENT>
Parse a tab-separated file containing reaction IDs and properties

    The reaction properties are parsed according to the header which specifies
    which property is contained in each column.