Skip to content

Commit 8b8f323

Browse files
committed
3.5
1 parent adaefca commit 8b8f323

File tree

3 files changed

+55
-19
lines changed

3 files changed

+55
-19
lines changed

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,9 @@
44
"--rootdir=Work",
55
],
66
"python.testing.unittestEnabled": false,
7-
"python.testing.pytestEnabled": true
7+
"python.testing.pytestEnabled": true,
8+
"[python]": {
9+
"editor.defaultFormatter": "ms-python.black-formatter"
10+
},
11+
"python.formatting.provider": "none"
812
}

Work/fileparse.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,30 @@
44

55
import csv
66

7-
def parse_csv(filename, select: list):
8-
'''
7+
8+
def parse_csv(filename, select: list = [], types: list = []):
9+
"""
910
Parse a CSV file into a list of records
10-
'''
11+
"""
1112
with open(filename) as f:
1213
rows = csv.reader(f)
1314

1415
# Read the file headers
15-
headers = next(rows)
16-
select_indices = [headers.index(name) for name in select] \
17-
if select \
16+
file_headers = next(rows)
17+
headers = select if select else file_headers
18+
indices = (
19+
[headers.index(name) for name in select]
20+
if select
1821
else [i for i in range(len(headers))]
19-
if select:
20-
headers = select
22+
)
2123
records = []
2224
for row in rows:
23-
if not row: # Skip rows with no data
25+
if not row: # Skip rows with no data
2426
continue
25-
record = dict(zip(
26-
headers,
27-
[row[i] for i in select_indices]))
27+
select_row = [row[col] for col in indices]
28+
if types:
29+
select_row = [func(col) for func, col in zip(types, select_row)]
30+
record = dict(zip(headers, select_row))
2831
records.append(record)
2932

30-
return records
33+
return records

Work/fileparse_test.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,37 @@
11
from fileparse import parse_csv
22

3+
34
def test_parse_csv_select_3_4():
4-
assert parse_csv('Data/portfolio.csv', select=['name','shares']) == \
5-
[{'name': 'AA', 'shares': '100'}, {'name': 'IBM', 'shares': '50'},
6-
{'name': 'CAT', 'shares': '150'}, {'name': 'MSFT', 'shares': '200'},
7-
{'name': 'GE', 'shares': '95'}, {'name': 'MSFT', 'shares': '50'},
8-
{'name': 'IBM', 'shares': '100'}]
5+
assert parse_csv("Data/portfolio.csv", select=["name", "shares"]) == [
6+
{"name": "AA", "shares": "100"},
7+
{"name": "IBM", "shares": "50"},
8+
{"name": "CAT", "shares": "150"},
9+
{"name": "MSFT", "shares": "200"},
10+
{"name": "GE", "shares": "95"},
11+
{"name": "MSFT", "shares": "50"},
12+
{"name": "IBM", "shares": "100"},
13+
]
14+
15+
16+
def test_parse_csv_select_3_5():
17+
assert parse_csv("Data/portfolio.csv", types=[str, int, float]) == [
18+
{"price": 32.2, "name": "AA", "shares": 100},
19+
{"price": 91.1, "name": "IBM", "shares": 50},
20+
{"price": 83.44, "name": "CAT", "shares": 150},
21+
{"price": 51.23, "name": "MSFT", "shares": 200},
22+
{"price": 40.37, "name": "GE", "shares": 95},
23+
{"price": 65.1, "name": "MSFT", "shares": 50},
24+
{"price": 70.44, "name": "IBM", "shares": 100},
25+
]
26+
27+
assert parse_csv(
28+
"Data/portfolio.csv", select=["name", "shares"], types=[str, int]
29+
) == [
30+
{"name": "AA", "shares": 100},
31+
{"name": "IBM", "shares": 50},
32+
{"name": "CAT", "shares": 150},
33+
{"name": "MSFT", "shares": 200},
34+
{"name": "GE", "shares": 95},
35+
{"name": "MSFT", "shares": 50},
36+
{"name": "IBM", "shares": 100},
37+
]

0 commit comments

Comments
 (0)