Source code for owmeta_core.data_trans.csv_ds

from contextlib import contextmanager
import csv

from .. import BASE_CONTEXT
from ..datasource import Informational, DataTranslator

from .local_file_ds import LocalFileDataSource
from .http_ds import HTTPFileDataSource


[docs]class CSVDataSource(LocalFileDataSource): ''' A CSV file data source ''' class_context = BASE_CONTEXT csv_file_name = Informational(display_name='CSV file name', also=LocalFileDataSource.file_name) csv_header = Informational(display_name='Header column names', multiple=False) csv_field_delimiter = Informational(display_name='CSV field delimiter', default_value=',')
[docs]class CSVHTTPFileDataSource(HTTPFileDataSource): ''' A CSV file retrieved over HTTP ''' class_context = BASE_CONTEXT csv_header = CSVDataSource.csv_header csv_field_delimiter = CSVDataSource.csv_field_delimiter
[docs]class CSVDataTranslator(DataTranslator): ''' A data translator which handles CSV files ''' class_context = BASE_CONTEXT input_type = (CSVDataSource,)
[docs] def make_reader(self, source, skipheader=True, dict_reader=False, skiplines=0, **kwargs): ''' Make a CSV reader Parameters ---------- source : CSVDataSource The data source to read from skipheader : bool If true, the first line read of the CSV file after the reader is created will not be returned from the reader dict_reader : bool If true, the reader will be a `~csv.DictReader` skiplines : int A number of lines to skip before creating the reader. Useful if the CSV file contains some commentary or other 'front matter' **kwargs Remaining arguments passed on to `~csv.reader` or `~csv.DictReader` ''' params = dict() delim = source.csv_field_delimiter.one() if delim: params['delimiter'] = str(delim) params['skipinitialspace'] = True params.update(kwargs) @contextmanager def cm(skiplines, dict_reader): _skipheader = skipheader fname = source.full_path() with open(fname) as f: while skiplines > 0: next(f) skiplines -= 1 if dict_reader: if 'fieldnames' not in params: _skipheader = False reader = csv.DictReader(f, **params) else: reader = csv.reader(f, **params) if _skipheader: next(reader) yield reader return cm(skiplines, dict_reader)
reader = make_reader ''' Alias to `make_reader` '''