-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsvtools.py
87 lines (73 loc) · 2.72 KB
/
csvtools.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import csv
from datetime import datetime
now = datetime.today()
currentDateString = '{0}-{1}-{2}'
currentDateString = currentDateString.format(str(now.year), str(now.month),
str(now.day))
#############
# Classes #
#############
class Report:
def __init__(self, reportFile, writeFile=None, date="%Y-%m-%d %H:%M:%S"):
"""Read in a CSV file."""
with open(reportFile, 'rb') as readFile:
self.fileRows = [row for row in csv.reader(readFile)]
readFile.close()
self.rowBuffer = self.fileRows
self.dateFormat = date
if writeFile == None:
self.writeFile = '%s_write_%s.csv' % (reportFile[:-4],
currentDateString)
def __str__(self):
return str(self.rowBuffer)
def __getitem__(self, index):
return self.rowBuffer[index]
####################
# Custom Methods #
####################
def write(self, writeFileName=None):
if not writeFileName:
writeFileName = self.writeFile
with open(writeFileName, 'wb') as writingFile:
importWriter = csv.writer(writingFile)
for row in self.rowBuffer:
importWriter.writerow(row)
writingFile.close()
def reset(self):
del self.rowBuffer
self.rowBuffer = self.fileRows
return self
def headers(self):
return self.rowBuffer[0]
def removeColumns(self, *args):
for arg in args:
index = self.headers().index(arg)
for row in self.rowBuffer:
row.pop(index)
return self
def filter(self, column, query=None, header=True, inverse=False):
if column not in self.headers():
print 'Error: invalid column header name.'
else:
columnIndex = self.headers().index(column)
if inverse:
self.rowBuffer = [row for row in
self.rowBuffer if query not in row[columnIndex]]
else:
self.rowBuffer = [row for row in
self.rowBuffer if query in row[columnIndex]]
if self.rowBuffer[0] != self.fileRows[0]:
self.rowBuffer.insert(0, self.fileRows[0])
return self
def toDict(self):
dictFromColumns = {}
def toDate(datestr):
return datetime.strptime(datestr, self.dateFormat)
for i, elem in enumerate(self.rowBuffer[0]):
# Convert strings to dates where applicable.
if 'date' in elem:
column = [toDate(row[i]) for row in self.rowBuffer[1:]]
else:
column = [row[i] for row in self.rowBuffer[1:]]
dictFromColumns[elem] = column
return dictFromColumns