1 # -*- coding: utf-8 -*-
6 class _UnicodeWriteWrapper(object):
7 """Simple write() wrapper that converts unicode to bytes."""
9 def __init__(self, binary, encoding, errors):
11 self.encoding = encoding
14 def write(self, string):
15 return self.binary.write(string.encode(self.encoding, self.errors))
18 class UnicodeWriter(object):
19 def __init__(self, f, dialect=csv.excel, encoding='utf-8', errors='strict',
24 f = _UnicodeWriteWrapper(f, encoding=encoding, errors=errors)
25 self.writer = csv.writer(f, dialect, *args, **kwds)
27 def writerow(self, row):
28 return self.writer.writerow(row)
30 def writerows(self, rows):
31 return self.writer.writerows(rows)
35 return self.writer.dialect
38 class UnicodeReader(object):
39 def __init__(self, f, dialect=None, encoding='utf-8', errors='strict',
42 format_params = ['delimiter', 'doublequote', 'escapechar',
43 'lineterminator', 'quotechar', 'quoting',
47 if not any([kwd_name in format_params
48 for kwd_name in kwds.keys()]):
51 f = (bs.decode(encoding, errors=errors) for bs in f)
52 self.reader = csv.reader(f, dialect, **kwds)
55 return self.reader.__next__()
62 return self.reader.dialect
66 return self.reader.line_num
69 writer = UnicodeWriter
70 reader = UnicodeReader
73 class DictWriter(csv.DictWriter):
74 def __init__(self, csvfile, fieldnames, restval='',
75 extrasaction='raise', dialect='excel', encoding='utf-8',
76 errors='strict', *args, **kwds):
77 super().__init__(csvfile, fieldnames, restval,
78 extrasaction, dialect, *args, **kwds)
79 self.writer = UnicodeWriter(csvfile, dialect, encoding=encoding,
80 errors=errors, *args, **kwds)
81 self.encoding_errors = errors
83 def writeheader(self):
84 header = dict(zip(self.fieldnames, self.fieldnames))
88 class DictReader(csv.DictReader):
89 def __init__(self, csvfile, fieldnames=None, restkey=None, restval=None,
90 dialect='excel', encoding='utf-8', errors='strict', *args,
92 csv.DictReader.__init__(self, csvfile, fieldnames, restkey, restval,
93 dialect, *args, **kwds)
94 self.reader = UnicodeReader(csvfile, dialect, encoding=encoding,
95 errors=errors, *args, **kwds)