Skip to content

Commit 452bfa6

Browse files
committed
Implemented interface ot csv.DictReader for #92
1 parent ff09913 commit 452bfa6

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

functional/streams.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,20 @@ def csv(self, csv_file, dialect='excel', **fmt_params):
136136
csv_input = csvapi.reader(input_file, dialect=dialect, **fmt_params)
137137
return self(csv_input).cache(delete_lineage=True)
138138

139+
def csv_dict_reader(self, csv_file, fieldnames=None, restkey=None, restval=None,
140+
dialect='excel', **kwds):
141+
if isinstance(csv_file, str):
142+
file_open = get_read_function(csv_file, self.disable_compression)
143+
input_file = file_open(csv_file)
144+
elif hasattr(csv_file, 'next') or hasattr(csv_file, '__next__'):
145+
input_file = csv_file
146+
else:
147+
raise ValueError('csv_file must be a file path or implement the iterator interface')
148+
149+
csv_input = csvapi.DictReader(input_file, fieldnames=fieldnames, restkey=restkey,
150+
restval=restval, dialect=dialect, **kwds)
151+
return self(csv_input).cache(delete_lineage=True)
152+
139153
def jsonl(self, jsonl_file):
140154
"""
141155
Reads and parses the input of a jsonl file stream or file.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
a,b,c
2+
1,2,3
3+
4,5,6

functional/test/test_streams.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,27 @@ def test_csv(self):
7676
with self.assertRaises(ValueError):
7777
self.seq.csv(1)
7878

79+
def test_csv_dict_reader(self):
80+
result = self.seq.csv_dict_reader('functional/test/data/test_header.csv').to_list()
81+
self.assertEqual(result[0]['a'], '1')
82+
self.assertEqual(result[0]['b'], '2')
83+
self.assertEqual(result[0]['c'], '3')
84+
self.assertEqual(result[1]['a'], '4')
85+
self.assertEqual(result[1]['b'], '5')
86+
self.assertEqual(result[1]['c'], '6')
87+
88+
with open('functional/test/data/test_header.csv', 'r') as f:
89+
result = self.seq.csv_dict_reader(f).to_list()
90+
self.assertEqual(result[0]['a'], '1')
91+
self.assertEqual(result[0]['b'], '2')
92+
self.assertEqual(result[0]['c'], '3')
93+
self.assertEqual(result[1]['a'], '4')
94+
self.assertEqual(result[1]['b'], '5')
95+
self.assertEqual(result[1]['c'], '6')
96+
97+
with self.assertRaises(ValueError):
98+
self.seq.csv_dict_reader(1)
99+
79100
def test_gzip_csv(self):
80101
result = self.seq.csv('functional/test/data/test.csv.gz').to_list()
81102
expect = [['1', '2', '3', '4'], ['a', 'b', 'c', 'd']]

0 commit comments

Comments
 (0)