import csv from typing import Iterable, Optional, Sequence def csv_as_dicts( lines: Iterable[str], types: Sequence[type], headers: Optional[Sequence[str]] = None ): records = [] rows = csv.reader(lines) if headers is None: headers = next(rows) for row in rows: record = {name: func(val) for name, func, val in zip(headers, types, row)} records.append(record) return records def read_csv_as_dicts( filename: str, types: Sequence[type], headers: Optional[Sequence[str]] = None ): """ Read CSV data into list of dictionaries with optional type conversion. """ with open(filename) as file: return csv_as_dicts(file, types, headers) def csv_as_instances(lines: Iterable[str], cls: type, has_headers: bool = True): records = [] rows = csv.reader(lines) if has_headers: next(rows) for row in rows: record = cls.from_row(row) records.append(record) return records def read_csv_as_instances(filename: str, cls: type, has_headers: bool = True): """ Read CSV data into list of instances. """ with open(filename) as file: return csv_as_instances(file, cls, has_headers)