diff options
| author | Kenneth Reitz <me@kennethreitz.com> | 2011-05-12 02:00:46 -0400 |
|---|---|---|
| committer | Kenneth Reitz <me@kennethreitz.com> | 2011-05-12 02:01:07 -0400 |
| commit | 5c50c1822e0d9f0fa493c064902d48cb092fd831 (patch) | |
| tree | 3330597cb08d30ae72a88b63c4eb70f478ff2471 /tablib/packages | |
| parent | 84e4bd9a47c1a26c17f03335fa47b623df1db1ed (diff) | |
| download | tablib-5c50c1822e0d9f0fa493c064902d48cb092fd831.tar.gz | |
integration of unicodecsv module
refs #7
Diffstat (limited to 'tablib/packages')
| -rw-r--r-- | tablib/packages/unicodecsv/__init__.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/tablib/packages/unicodecsv/__init__.py b/tablib/packages/unicodecsv/__init__.py new file mode 100644 index 0000000..e640987 --- /dev/null +++ b/tablib/packages/unicodecsv/__init__.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +import csv +from csv import * + +#http://semver.org/ +VERSION = (0, 8, 0) +__version__ = ".".join(map(str,VERSION)) + +def _stringify(s, encoding): + if type(s)==unicode: + return s.encode(encoding) + elif isinstance(s, (int , float)): + pass #let csv.QUOTE_NONNUMERIC do its thing. + elif type(s) != str: + s=str(s) + return s + +def _stringify_list(l, encoding): + return [_stringify(s, encoding) for s in l] + +class UnicodeWriter(object): + """ + >>> import unicodecsv + >>> from cStringIO import StringIO + >>> f = StringIO() + >>> w = unicodecsv.writer(f, encoding='utf-8') + >>> w.writerow((u'é', u'ñ')) + >>> f.seek(0) + >>> r = unicodecsv.reader(f, encoding='utf-8') + >>> row = r.next() + >>> print row[0], row[1] + é ñ + """ + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + self.writer = csv.writer(f) + self.dialect = dialect + self.encoding = encoding + self.writer = csv.writer(f, dialect=dialect, **kwds) + + def writerow(self, row): + self.writer.writerow(_stringify_list(row, self.encoding)) + + def writerows(self, rows): + for row in rows: + self.writerow(row) +writer = UnicodeWriter + +class UnicodeReader(object): + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + self.reader = csv.reader(f, dialect=dialect, **kwds) + self.encoding = encoding + + def next(self): + row = self.reader.next() + return [unicode(s, self.encoding) for s in row] + + def __iter__(self): + return self +reader = UnicodeReader + +class DictWriter(csv.DictWriter): + """ + >>> from cStringIO import StringIO + >>> f = StringIO() + >>> w = DictWriter(f, ['a', 'b'], restval=u'î') + >>> w.writerow({'a':'1'}) + >>> w.writerow({'a':'1', 'b':u'ø'}) + >>> w.writerow({'a':u'é'}) + >>> f.seek(0) + >>> r = DictReader(f, fieldnames=['a'], restkey='r') + >>> r.next() == {'a':u'1', 'r':[u"î"]} + True + >>> r.next() == {'a':u'1', 'r':[u"ø"]} + True + >>> r.next() == {'a':u'é', 'r':[u"î"]} + """ + def __init__(self, csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', encoding='utf-8', *args, **kwds): + self.fieldnames = fieldnames + self.encoding = encoding + self.restval = restval + self.writer = csv.DictWriter(csvfile, fieldnames, restval, extrasaction, dialect, *args, **kwds) + def writerow(self, d): + for fieldname in self.fieldnames: + if fieldname in d: + d[fieldname] = _stringify(d[fieldname], self.encoding) + else: + d[fieldname] = _stringify(self.restval, self.encoding) + self.writer.writerow(d) + +class DictReader(csv.DictReader): + def __init__(self, csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', encoding='utf-8', *args, **kwds): + self.restkey = restkey + self.encoding = encoding + self.reader = csv.DictReader(csvfile, fieldnames, restkey, restval, dialect, *args, **kwds) + def next(self): + d = self.reader.next() + for k, v in d.items(): + if k == self.restkey: + rest = v + if rest: + d[self.restkey] = [unicode(v, self.encoding) for v in rest] + else: + if v is not None: + d[k] = unicode(v, self.encoding) + return d |
