python-mastery/reader.py
2023-11-24 11:57:24 -06:00

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)