39
|
1 #!/usr/bin/env python
|
|
2 # -*- coding: utf-8 -*-
|
|
3
|
|
4 """
|
|
5 fields CSV
|
|
6 """
|
|
7
|
|
8 # imports
|
|
9 import csv
|
|
10 string = (str, unicode)
|
|
11
|
|
12 class FieldsCSV(object):
|
|
13 """fields-based CSV"""
|
|
14
|
|
15 fields = [] # ABC
|
|
16
|
|
17 @classmethod
|
|
18 def names(cls):
|
|
19 return [field[0] for field in cls.fields]
|
|
20
|
|
21 def parse(f):
|
|
22 if isinstance(f, string):
|
|
23 with open(f) as _f:
|
|
24 return self.parse(_f)
|
|
25
|
40
|
26 reader = csv.reader(f)
|
|
27 retval = []
|
|
28 for row in reader:
|
|
29
|
|
30 # ensure row length is correct
|
|
31 if len(row) != len(self.fields):
|
|
32 raise Exception("{} | Unrecognized summary row: {}".format(f.name, row))
|
|
33
|
|
34 # make a data object
|
|
35 values = dict(zip(self.names(), row))
|
39
|
36
|
40
|
37 # convert
|
|
38 try:
|
|
39 for name, _type in self.fields:
|
|
40 values[name] = _type(values[name])
|
|
41 except Exception as e:
|
|
42 raise Exception("{} | Unable to convert row: {}".format(f.name, e))
|
|
43
|
|
44 retval.append(values)
|
|
45 return values
|
|
46
|