From 70716fdd216755dc4b542df74e95b0e5ac74f0ee Mon Sep 17 00:00:00 2001 From: papisz Date: Wed, 9 Apr 2014 22:35:56 +0200 Subject: CSV custom delimiter support --- tablib/core.py | 2 ++ tablib/formats/_csv.py | 20 ++++++++++---------- tablib/formats/_tsv.py | 49 ++++++++++--------------------------------------- 3 files changed, 22 insertions(+), 49 deletions(-) (limited to 'tablib') diff --git a/tablib/core.py b/tablib/core.py index 86f75b2..9953ffa 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -256,6 +256,8 @@ class Dataset(object): setattr(cls, fmt.title, property(fmt.export_set, fmt.import_set)) except AttributeError: setattr(cls, fmt.title, property(fmt.export_set)) + setattr(cls, 'set_%s' % fmt.title, fmt.import_set) + setattr(cls, 'get_%s' % fmt.title, fmt.export_set) except AttributeError: pass diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py index c5d3202..7deec23 100644 --- a/tablib/formats/_csv.py +++ b/tablib/formats/_csv.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -""" Tablib - CSV Support. +""" Tablib - *SV Support. """ from tablib.compat import is_py3, csv, StringIO @@ -11,17 +11,17 @@ extensions = ('csv',) DEFAULT_ENCODING = 'utf-8' +DEFAULT_DELIMITER = ',' - -def export_set(dataset): +def export_set(dataset, delimiter=DEFAULT_DELIMITER): """Returns CSV representation of Dataset.""" stream = StringIO() if is_py3: - _csv = csv.writer(stream) + _csv = csv.writer(stream, delimiter=delimiter) else: - _csv = csv.writer(stream, encoding=DEFAULT_ENCODING) + _csv = csv.writer(stream, delimiter=delimiter, encoding=DEFAULT_ENCODING) for row in dataset._package(dicts=False): _csv.writerow(row) @@ -29,15 +29,15 @@ def export_set(dataset): return stream.getvalue() -def import_set(dset, in_stream, headers=True): +def import_set(dset, in_stream, headers=True, delimiter=DEFAULT_DELIMITER): """Returns dataset from CSV stream.""" dset.wipe() if is_py3: - rows = csv.reader(in_stream.splitlines()) + rows = csv.reader(in_stream.splitlines(), delimiter=delimiter) else: - rows = csv.reader(in_stream.splitlines(), encoding=DEFAULT_ENCODING) + rows = csv.reader(in_stream.splitlines(), delimiter=delimiter, encoding=DEFAULT_ENCODING) for i, row in enumerate(rows): if (i == 0) and (headers): @@ -46,10 +46,10 @@ def import_set(dset, in_stream, headers=True): dset.append(row) -def detect(stream): +def detect(stream, delimiter=DEFAULT_DELIMITER): """Returns True if given stream is valid CSV.""" try: - csv.Sniffer().sniff(stream, delimiters=',') + csv.Sniffer().sniff(stream, delimiters=delimiter) return True except (csv.Error, TypeError): return False diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index 8ef2b67..9380b3b 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -3,57 +3,28 @@ """ Tablib - TSV (Tab Separated Values) Support. """ -from tablib.compat import is_py3, csv, StringIO - - +from tablib.formats._csv import ( + export_set as export_set_wrapper, + import_set as import_set_wrapper, + detect as detect_wrapper, +) title = 'tsv' extensions = ('tsv',) DEFAULT_ENCODING = 'utf-8' +DELIMITER = '\t' def export_set(dataset): - """Returns a TSV representation of Dataset.""" - - stream = StringIO() - - if is_py3: - _tsv = csv.writer(stream, delimiter='\t') - else: - _tsv = csv.writer(stream, encoding=DEFAULT_ENCODING, delimiter='\t') - - for row in dataset._package(dicts=False): - _tsv.writerow(row) - - return stream.getvalue() + """Returns TSV representation of Dataset.""" + return export_set_wrapper(dataset, delimiter=DELIMITER) def import_set(dset, in_stream, headers=True): """Returns dataset from TSV stream.""" - - dset.wipe() - - if is_py3: - rows = csv.reader(in_stream.splitlines(), delimiter='\t') - else: - rows = csv.reader(in_stream.splitlines(), delimiter='\t', - encoding=DEFAULT_ENCODING) - - for i, row in enumerate(rows): - # Skip empty rows - if not row: - continue - - if (i == 0) and (headers): - dset.headers = row - else: - dset.append(row) + return import_set_wrapper(dset, in_stream, headers=headers, delimiter=DELIMITER) def detect(stream): """Returns True if given stream is valid TSV.""" - try: - csv.Sniffer().sniff(stream, delimiters='\t') - return True - except (csv.Error, TypeError): - return False + return detect_wrapper(stream, delimiter=DELIMITER) -- cgit v1.2.1