Skip to content

Commit 2f1f680

Browse files
committed
Added decode_csv and encode_csv methods to io_util.
1 parent 2ac3305 commit 2f1f680

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

benedict/utils/io_util.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# -*- coding: utf-8 -*-
22

3-
from six import binary_type, string_types
3+
from six import binary_type, string_types, StringIO
44

55
import base64
6+
import csv
67
import errno
78
import json
89
import os
@@ -51,6 +52,28 @@ def decode_base64(s, **kwargs):
5152
return data
5253

5354

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+
5477
def decode_json(s, **kwargs):
5578
data = json.loads(s, **kwargs)
5679
return data
@@ -108,6 +131,32 @@ def encode_base64(d, **kwargs):
108131
return data
109132

110133

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+
111160
def encode_json(d, **kwargs):
112161
data = json.dumps(d, **kwargs)
113162
return data

0 commit comments

Comments
 (0)