Source code for mysqltsv.reader

"""
This module provides a set of utilities for reading TSV files.

.. autoclass:: mysqltsv.reader.Reader
    :members:

.. autofunction:: mysqltsv.functions.read

"""

import logging

from .errors import RowReadingError
from .row_type import generate_row_type
from .util import read_row

logger = logging.getLogger(__name__)


def raise_exception(lineno, line, e):
    raise RowReadingError(lineno, line, e)


[docs]class Reader: """ Constructs a new TSV row reader -- which acts as an iterable of :class:`~mysqltsv.row_type.AbstractRow`. :Parameters: f : `file` A file pointer headers : `bool` | `list`(`str`) If True, read the first row of the file as a set of headers. If a list of `str` is provided, use those strings as headers. Otherwise, assume no headers. types : `list`( `callable` ) A list of `callable` to apply to the row values. If none is provided, all values will be read as `str` none_string : `str` A string that will be interpreted as None when read. (Defaults to "NULL") error_handler : `callable` A function that takes three arguements (lineno, line, exception) that handles an error during row reading. The default behavior is to throw a :class:`mysqltsv.errors.RowReadingError` """ def __init__(self, f, headers=True, types=None, none_string="NULL", error_handler=raise_exception): self.f = f if headers == True: headers = list(read_row(f.readline())) elif hasattr(headers, "__iter__"): headers = list(headers) else: headers = None self.row_type = generate_row_type(headers, types=types, none_string=none_string) self.headers = headers """ `list`(`str`) : A list of headers if provided """ self.none_string = none_string self.error_handler = error_handler def __iter__(self): for i, line in enumerate(self.f): try: yield self.row_type(line) except Exception as e: lineno = i+1 if self.headers is None else i+2 self.error_handler(lineno, line, e) def __next__(self): line = self.f.readline() if line != "": return self.row_type(line) else: raise StopIteration()