45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
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)
|