|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 |
|
3 | | -from six import binary_type, string_types |
| 3 | +from six import binary_type, string_types, StringIO |
4 | 4 |
|
5 | 5 | import base64 |
| 6 | +import csv |
6 | 7 | import errno |
7 | 8 | import json |
8 | 9 | import os |
@@ -51,6 +52,28 @@ def decode_base64(s, **kwargs): |
51 | 52 | return data |
52 | 53 |
|
53 | 54 |
|
| 55 | +def decode_csv(s, **kwargs): |
| 56 | + # kwargs.setdefault('delimiter', ',') |
| 57 | + if kwargs.pop('quote', False): |
| 58 | + kwargs.setdefault('quoting', csv.QUOTE_ALL) |
| 59 | + columns = kwargs.pop('columns', None) |
| 60 | + columns_row = kwargs.pop('columns_row', True) |
| 61 | + f = StringIO(s) |
| 62 | + r = csv.reader(f, **kwargs) |
| 63 | + ln = 0 |
| 64 | + data = [] |
| 65 | + for row in r: |
| 66 | + if ln == 0 and columns_row: |
| 67 | + if not columns: |
| 68 | + columns = row |
| 69 | + ln += 1 |
| 70 | + continue |
| 71 | + d = dict(zip(columns, row)) |
| 72 | + data.append(d) |
| 73 | + ln += 1 |
| 74 | + return data |
| 75 | + |
| 76 | + |
54 | 77 | def decode_json(s, **kwargs): |
55 | 78 | data = json.loads(s, **kwargs) |
56 | 79 | return data |
@@ -108,6 +131,32 @@ def encode_base64(d, **kwargs): |
108 | 131 | return data |
109 | 132 |
|
110 | 133 |
|
| 134 | +def encode_csv(l, **kwargs): |
| 135 | + # kwargs.setdefault('delimiter', ',') |
| 136 | + if kwargs.pop('quote', False): |
| 137 | + kwargs.setdefault('quoting', csv.QUOTE_ALL) |
| 138 | + kwargs.setdefault('lineterminator', '\n') |
| 139 | + columns = kwargs.pop('columns', None) |
| 140 | + columns_row = kwargs.pop('columns_row', True) |
| 141 | + if not columns and len(l) and isinstance(l[0], dict): |
| 142 | + keys = [str(key) for key in l[0].keys()] |
| 143 | + columns = list(sorted(keys)) |
| 144 | + f = StringIO() |
| 145 | + w = csv.writer(f, **kwargs) |
| 146 | + if columns_row and columns: |
| 147 | + w.writerow(columns) |
| 148 | + for item in l: |
| 149 | + if isinstance(item, dict): |
| 150 | + row = [item.get(key, '') for key in columns] |
| 151 | + elif isinstance(item, (list, tuple, set, )): |
| 152 | + row = item |
| 153 | + else: |
| 154 | + row = [item] |
| 155 | + w.writerow(row) |
| 156 | + data = f.getvalue() |
| 157 | + return data |
| 158 | + |
| 159 | + |
111 | 160 | def encode_json(d, **kwargs): |
112 | 161 | data = json.dumps(d, **kwargs) |
113 | 162 | return data |
|
0 commit comments