Source code for buildingmotif.ingresses.csvingress
from csv import DictReader
from functools import cached_property
from io import StringIO
from pathlib import Path
from typing import List, Optional, Union
from buildingmotif.ingresses.base import Record, RecordIngressHandler
[docs]class CSVIngress(RecordIngressHandler):
"""Reads rows from a CSV file and exposes them as records.
The type of the record is the name of the CSV file
"""
def __init__(
self,
filename: Optional[Path] = None,
data: Optional[Union[str, StringIO]] = None,
):
if filename is not None and data is not None:
raise ValueError("Both filename and data are defined.")
if filename:
self.dict_reader = DictReader(open(filename))
self.rtype = str(filename)
elif data:
# if data is a string, convert to StringIO
if isinstance(data, str):
data = StringIO(data)
self.dict_reader = DictReader(data, delimiter=",")
self.rtype = "data stream"
else:
raise ValueError("Either filename or data must be defined.")
@cached_property
def records(self) -> List[Record]:
records = []
for row in self.dict_reader:
rec = Record(
rtype=self.rtype,
fields=row,
)
records.append(rec)
return records