def parse_file(lines, require_order=None): """ >>> lines = ['# q:str ans:str s:int c:int rel:float\\n', 'url\\tph\\t1000\\t15\\t1.2\\n'] >>> list(parse_file(lines)) [Rec(q='url', ans='ph', s=1000, c=15, rel=1.2)] """ lines_iter = iter(lines) header = list(islice(lines_iter, 1)) if len(header) == 1: data_desc = parse_header(header[0]) if require_order: if not data_desc.order.is_ordered_by(parse_header_order(require_order)): raise Exception("require_order check of {0} failure on {1}.".format(require_order, data_desc.order)) field_spec = [] for field in data_desc.fields: field_spec.append((field.name, TYPE_MAP[field.type])) parser = FileParser(field_separator="\t", rec_parser=RecParser(field_spec)) return ParsedFile(data_desc, parser(lines_iter)) else: raise Exception("No header")
def desc(self): return parse_header(self.header)