[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)