Skip to content

Commit 9f35685

Browse files
committed
added some conversion funcs to cbook to support csv2rec
svn path=/trunk/matplotlib/; revision=3390
1 parent c4d8ec8 commit 9f35685

File tree

2 files changed

+98
-24
lines changed

2 files changed

+98
-24
lines changed

lib/matplotlib/cbook.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"""
55
from __future__ import generators
66
import re, os, errno, sys, StringIO, traceback
7+
import time, datetime
78
import matplotlib.numerix as nx
89

910
try: set
@@ -12,6 +13,67 @@
1213

1314
major, minor1, minor2, s, tmp = sys.version_info
1415

16+
17+
class converter:
18+
def __init__(self, missing='Null', missingval=None):
19+
self.missing = missing
20+
self.missingval = missingval
21+
def __call__(self, s):
22+
if s==self.missing: return self.missingval
23+
return s
24+
25+
def is_missing(self, s):
26+
return not s.strip() or s==self.missing
27+
28+
class tostr(converter):
29+
'convert to string or None'
30+
def __init__(self, missing='Null', missingval=''):
31+
converter.__init__(self, missing=missing, missingval=missingval)
32+
33+
class todatetime(converter):
34+
'convert to a datetime or None'
35+
def __init__(self, fmt='%Y-%m-%d', missing='Null', missingval=None):
36+
'use a time.strptime format string for conversion'
37+
converter.__init__(self, missing, missingval)
38+
self.fmt = fmt
39+
40+
def __call__(self, s):
41+
if self.is_missing(): return self.missingval
42+
tup = time.strptime(s, self.fmt)
43+
return datetime.datetime(*tup[:6])
44+
45+
46+
47+
class todate(converter):
48+
'convert to a date or None'
49+
def __init__(self, fmt='%Y-%m-%d', missing='Null', missingval=None):
50+
'use a time.strptime format string for conversion'
51+
converter.__init__(self, missing, missingval)
52+
self.fmt = fmt
53+
def __call__(self, s):
54+
if self.is_missing(): return self.missingval
55+
tup = time.strptime(s, self.fmt)
56+
return datetime.date(*tup[:3])
57+
58+
class tofloat(converter):
59+
'convert to a float or None'
60+
def __init__(self, missing='Null', missingval=None):
61+
converter.__init__(self, missing)
62+
self.missingval = missingval
63+
def __call__(self, s):
64+
if self.is_missing(): return self.missingval
65+
return float(s)
66+
67+
68+
class toint(converter):
69+
'convert to an int or None'
70+
def __init__(self, missing='Null', missingval=None):
71+
converter.__init__(self, missing)
72+
73+
def __call__(self, s):
74+
if self.is_missing(): return self.missingval
75+
return int(s)
76+
1577
class CallbackRegistry:
1678
"""
1779
Handle registering and disconnecting for a set of signals and

lib/matplotlib/mlab.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,14 +1365,17 @@ def load(fname,comments='#',delimiter=None, converters=None,skiprows=0,
13651365
else: return X
13661366

13671367
def csv2rec(fname, comments='#', skiprows=0, checkrows=5, delimiter=',',
1368-
converterd=None):
1368+
converterd=None, names=None):
13691369
"""
13701370
Load data from comma/space/tab delimited file in fname into a
13711371
numpy record array and return the record array.
13721372
1373-
A header row is required to automatically assign the recarray
1374-
names. The headers will be lower cased, spaces will be converted
1375-
to underscores, and illegal attribute name characters removed.
1373+
If names is None, a header row is required to automatically assign
1374+
the recarray names. The headers will be lower cased, spaces will
1375+
be converted to underscores, and illegal attribute name characters
1376+
removed. If names is not None, it is a sequence of names to use
1377+
for the column names. In this case, it is assumed there is no header row.
1378+
13761379
13771380
fname - can be a filename or a file handle. Support for gzipped
13781381
files is automatic, if the filename ends in .gz
@@ -1388,9 +1391,12 @@ def csv2rec(fname, comments='#', skiprows=0, checkrows=5, delimiter=',',
13881391
converterd, if not None, is a dictionary mapping column number or
13891392
munged column name to a converter function
13901393
1394+
13911395
See examples/loadrec.py
13921396
"""
13931397

1398+
1399+
13941400
if converterd is None:
13951401
converterd = dict()
13961402

@@ -1431,6 +1437,8 @@ def get_converters(reader):
14311437
converters = [int]*len(row)
14321438
if checkrows and i>checkrows:
14331439
break
1440+
#print i, len(names), len(row)
1441+
#print 'converters', zip(converters, row)
14341442
for j, (name, item) in enumerate(zip(names, row)):
14351443
func = converterd.get(j)
14361444
if func is None:
@@ -1443,25 +1451,28 @@ def get_converters(reader):
14431451

14441452

14451453
# Get header and remove invalid characters
1446-
headers = reader.next()
1447-
# remove these chars
1448-
delete = set("""~!@#$%^&*()-=+~\|]}[{';: /?.>,<""")
1449-
delete.add('"')
1450-
1451-
names = []
1452-
seen = dict()
1453-
for i, item in enumerate(headers):
1454-
item = item.strip().lower().replace(' ', '_')
1455-
item = ''.join([c for c in item if c not in delete])
1456-
if not len(item):
1457-
item = 'column%d'%i
1458-
1459-
cnt = seen.get(item, 0)
1460-
if cnt>0:
1461-
names.append(item + '%d'%cnt)
1462-
else:
1463-
names.append(item)
1464-
seen[item] = cnt+1
1454+
1455+
needheader = names is None
1456+
if needheader:
1457+
headers = reader.next()
1458+
# remove these chars
1459+
delete = set("""~!@#$%^&*()-=+~\|]}[{';: /?.>,<""")
1460+
delete.add('"')
1461+
1462+
names = []
1463+
seen = dict()
1464+
for i, item in enumerate(headers):
1465+
item = item.strip().lower().replace(' ', '_')
1466+
item = ''.join([c for c in item if c not in delete])
1467+
if not len(item):
1468+
item = 'column%d'%i
1469+
1470+
cnt = seen.get(item, 0)
1471+
if cnt>0:
1472+
names.append(item + '%d'%cnt)
1473+
else:
1474+
names.append(item)
1475+
seen[item] = cnt+1
14651476

14661477

14671478

@@ -1473,7 +1484,8 @@ def get_converters(reader):
14731484
# reset the reader and start over
14741485
fh.seek(0)
14751486
process_skiprows(reader)
1476-
skipheader = reader.next()
1487+
if needheader:
1488+
skipheader = reader.next()
14771489

14781490
# iterate over the remaining rows and convert the data to date
14791491
# objects, ints, or floats as approriate

0 commit comments

Comments
 (0)