def io_test(): # prepare data --- file_path = "sample_data.csv" csv_text = "\n".join([ '"attr_a","attr_b","attr_c"', '1,4,"a"', '2,2.1,"bb"', '3,120.9,"ccc"', ]) with open(file_path, "w") as f: f.write(csv_text) # load from a csv text --- loader = ptr.CsvTableTextLoader(csv_text) for table_data in loader.load(): print("\n".join([ "load from text", "==============", "{:s}".format(ptw.dumps_tabledata(table_data)), ])) # load from a csv file --- loader = ptr.CsvTableFileLoader(file_path) for table_data in loader.load(): print("\n".join([ "load from file", "==============", "{:s}".format(ptw.dumps_tabledata(modify(table_data))), ]))
def create_table_from_csv(self, csv_source, table_name="", attr_name_list=(), delimiter=",", quotechar='"', encoding="utf-8"): """ Create a table from a CSV file/text. :param str csv_source: Path to the CSV file or CSV text. :param str table_name: Table name to create. Using CSV file basename as the table name if the value is empty. :param list attr_name_list: Attribute names of the table. Use the first line of the CSV file as attribute list if attribute_name_list is empty. :param str delimiter: A one-character string used to separate fields. :param str quotechar: A one-character string used to quote fields containing special characters, such as the ``delimiter`` or ``quotechar``, or which contain new-line characters. :param str encoding: CSV file encoding. :raises ValueError: If the CSV data is invalid. :Example: :ref:`example-create-table-from-csv` .. seealso:: :py:meth:`.create_table_from_data_matrix` :py:func:`csv.reader` :py:meth:`.pytablereader.CsvTableFileLoader.load` :py:meth:`.pytablereader.CsvTableTextLoader.load` """ loader = ptr.CsvTableFileLoader(csv_source) if typepy.is_not_null_string(table_name): loader.table_name = table_name loader.header_list = attr_name_list loader.delimiter = delimiter loader.quotechar = quotechar loader.encoding = encoding try: for tabledata in loader.load(): self.create_table_from_tabledata(tabledata) return except (ptr.InvalidFilePathError, IOError): pass loader = ptr.CsvTableTextLoader(csv_source) if typepy.is_not_null_string(table_name): loader.table_name = table_name loader.header_list = attr_name_list loader.delimiter = delimiter loader.quotechar = quotechar loader.encoding = encoding for tabledata in loader.load(): self.create_table_from_tabledata(tabledata)
def test_null(self, table_name, header_list, expected): loader = ptr.CsvTableTextLoader("dummy") loader.table_name = table_name loader.header_list = header_list with pytest.raises(expected): for _tabletuple in loader.load(): pass
def test_exception_insufficient_data(self, table_text, table_name, header_list, expected): loader = ptr.CsvTableTextLoader(table_text) loader.table_name = table_name loader.header_list = header_list with pytest.raises(expected): for _tabletuple in loader.load(): pass
def test_normal(self, table_text, table_name, header_list, expected): loader = ptr.CsvTableTextLoader(table_text) loader.table_name = table_name loader.header_list = header_list for tabledata in loader.load(): print(ptw.dump_tabledata(tabledata)) for e in expected: print(ptw.dump_tabledata(e)) assert tabledata.in_tabledata_list(expected)
def test_exception_invalid_csv(self): table_text = """nan = float("nan") inf = float("inf") TEST_TABLE_NAME = "test_table" TEST_DB_NAME = "test_db" NOT_EXIT_FILE_PATH = "/not/existing/file/__path__" NamedTuple = namedtuple("NamedTuple", "attr_a attr_b") NamedTupleEx = namedtuple("NamedTupleEx", "attr_a attr_b attr_c") """ loader = ptr.CsvTableTextLoader(table_text) loader.table_name = "dummy" with pytest.raises(ptr.InvalidDataError): for _tabletuple in loader.load(): pass
def test_normal_type_hint_rules(self): table_text = dedent("""\ "a text","b integer","c real" 1,"1","1.1" 2,"2","1.2" 3,"3","1.3" """) loader = ptr.CsvTableTextLoader(table_text) loader.table_name = "type hint rules" loader.type_hint_rules = TYPE_HINT_RULES for tbldata in loader.load(): assert tbldata.headers == ["a text", "b integer", "c real"] assert tbldata.value_matrix == [ ["1", 1, Decimal("1.1")], ["2", 2, Decimal("1.2")], ["3", 3, Decimal("1.3")], ]
def from_csv(self, csv_source, delimiter=","): """ Set tabular attributes to the writer from a character-separated values (CSV) data source. Following attributes are set to the writer by the method: - :py:attr:`~.header_list`. - :py:attr:`~.value_matrix`. :py:attr:`~.table_name` also be set if the CSV data source is a file. In that case, :py:attr:`~.table_name` is as same as the filename. :param str csv_source: Input CSV data source either can be designated CSV text or CSV file path. :Examples: :ref:`example-from-csv` :Dependency Packages: - `pytablereader <https://github.com/thombashi/pytablereader>`__ """ import pytablereader as ptr loader = ptr.CsvTableTextLoader(csv_source, quoting_flags=self._quoting_flags) loader.delimiter = delimiter try: for table_data in loader.load(): self.from_tabledata(table_data, is_overwrite_table_name=False) return except ptr.DataError: pass loader = ptr.CsvTableFileLoader(csv_source, quoting_flags=self._quoting_flags) loader.delimiter = delimiter for table_data in loader.load(): self.from_tabledata(table_data)
def test_normal(self, value, expected): loader = ptr.CsvTableTextLoader("dummy") loader.table_name = value assert loader.make_table_name() == expected
# prepare data --- file_path = "sample_data.csv" csv_text = "\n".join([ '"attr_a","attr_b","attr_c"', '1,4,"a"', '2,2.1,"bb"', '3,120.9,"ccc"', ]) with open(file_path, "w") as f: f.write(csv_text) # load from a csv file --- loader = ptr.CsvTableFileLoader(file_path) for table_data in loader.load(): print("\n".join([ "load from file", "==============", "{:s}".format(ptw.dumps_tabledata(table_data)), ])) # load from a csv text --- loader = ptr.CsvTableTextLoader(csv_text) for table_data in loader.load(): print("\n".join([ "load from text", "==============", "{:s}".format(ptw.dumps_tabledata(table_data)), ]))