Source code for archai.common.delimited_text

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.

from typing import Iterable, List, Mapping, OrderedDict

from archai.common import utils


[docs]class DelimitedText: def __init__(self) -> None: self._data: OrderedDict[str, List[str]] = OrderedDict()
[docs] def add_from_file(self, filepath: str, has_header: bool, delimiter: str = "\t") -> None: filepath = utils.full_path(filepath) header = None if has_header else [] with open(filepath, "r") as f: line = f.readline() while line: cols = line.rstrip("\n").split(sep=delimiter) if header is None: header = cols else: self.add_from_cols(cols, header)
[docs] def add_from_text(self, text: str, has_header: bool, delimiter: str = "\t") -> None: header = None if has_header else [] for line in text.splitlines(): cols = line.rstrip("\n").split(sep=delimiter) if header is None: header = cols else: self.add_from_cols(cols, header)
[docs] def add_from_cols(self, cols: Iterable, header: List[str]) -> None: for i, col in enumerate(cols): key = header[i] if len(header) > i else str(i) if key not in self._data: self._data[key] = [] self._data[key].append(str(col))
[docs] def get_col(self, col_name: str) -> List[str]: return self._data[col_name]
[docs] def set_col(self, col_name: str, vals: List[str]) -> None: self._data[col_name] = vals
[docs] def set_data(self, d: Mapping[str, List[str]]) -> None: self._data = OrderedDict(d)
[docs] def add_from_cols_list(self, cols_list: Iterable[Iterable], header: List[str]) -> None: for cols in cols_list: self.add_from_cols(cols, header)
[docs] def save(self, filepath: str, has_header=True, delimiter: str = "\t") -> None: keys = list(self._data.keys()) with open(filepath, "w") as f: if has_header: f.write(delimiter.join(keys) + "\n") for vals in zip(*(self._data[key] for key in keys)): f.write(delimiter.join(vals) + "\n")
def __len__(self) -> int: return len(self._data)