[Python-checkins] python/nondist/sandbox/csv csv.py,1.28,1.29
montanaro@users.sourceforge.net
montanaro@users.sourceforge.net
Mon, 10 Feb 2003 14:45:25 -0800
Update of /cvsroot/python/python/nondist/sandbox/csv
In directory sc8-pr-cvs1:/tmp/cvs-serv32758
Modified Files:
csv.py
Log Message:
* rename "rest" parameter to "restkey" in DictReader to tie in better with
"restval".
* add "extrasaction" parameter to DictWriter which tells how to treat dicts
which have keys not in the known fieldnames. (still need some tests.)
Index: csv.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/csv/csv.py,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** csv.py 10 Feb 2003 15:14:39 -0000 1.28
--- csv.py 10 Feb 2003 22:45:21 -0000 1.29
***************
*** 59,69 ****
class DictReader:
! def __init__(self, f, fieldnames, rest=None, restval=None,
dialect="excel", *args):
self.fieldnames = fieldnames # list of keys for the dict
! self.rest = rest # key to catch long rows
self.restval = restval # default value for short rows
self.reader = reader(f, dialect, *args)
def next(self):
row = self.reader.next()
--- 59,72 ----
class DictReader:
! def __init__(self, f, fieldnames, restkey=None, restval=None,
dialect="excel", *args):
self.fieldnames = fieldnames # list of keys for the dict
! self.restkey = restkey # key to catch long rows
self.restval = restval # default value for short rows
self.reader = reader(f, dialect, *args)
+ def __iter__(self):
+ return self
+
def next(self):
row = self.reader.next()
***************
*** 72,76 ****
lr = len(row)
if lf < lr:
! d[self.rest] = row[lf:]
elif lf > lr:
for key in self.fieldnames[lr:]:
--- 75,79 ----
lr = len(row)
if lf < lr:
! d[self.restkey] = row[lf:]
elif lf > lr:
for key in self.fieldnames[lr:]:
***************
*** 80,94 ****
class DictWriter:
! def __init__(self, f, fieldnames, dialect="excel", *args):
self.fieldnames = fieldnames # list of keys for the dict
self.writer = writer(f, dialect, *args)
def writerow(self, rowdict):
! row = [rowdict.get(key, "") for key in self.fieldnames]
! return self.writer.writerow(row)
def writerows(self, rowdicts):
rows = []
for rowdict in rowdicts:
! rows.append([rowdict.get(key, "") for key in self.fieldnames])
return self.writer.writerows(rows)
--- 83,113 ----
class DictWriter:
! def __init__(self, f, fieldnames, restval="", extrasaction="raise",
! dialect="excel", *args):
self.fieldnames = fieldnames # list of keys for the dict
+ self._fnsort = fieldnames[:]
+ self._fnsort.sort()
+ self.restval = restval # for writing short dicts
+ if extrasaction.lower() not in ("raise", "ignore"):
+ raise ValueError, \
+ ("extrasaction (%s) must be 'raise' or 'ignore'" %
+ extrasaction)
+ self.extrasaction = extrasaction
self.writer = writer(f, dialect, *args)
+ def _dict_to_list(self, rowdict):
+ keys = rowdict.keys()
+ keys.sort()
+ if keys != self._fnsort:
+ if self.extrasaction == "raise":
+ raise ValueError, "dict contains fields not in fieldnames"
+ return [rowdict.get(key, self.restval) for key in self.fieldnames]
+
def writerow(self, rowdict):
! return self.writer.writerow(self._dict_to_list(rowdict))
def writerows(self, rowdicts):
rows = []
for rowdict in rowdicts:
! rows.append(self._dict_to_list(rowdict))
return self.writer.writerows(rows)