diff --git a/Lib/csv.py b/Lib/csv.py index 6a8587674fe02b..1fd15fad86cbe5 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -18,8 +18,8 @@ "Error", "Dialect", "__doc__", "excel", "excel_tab", "field_size_limit", "reader", "writer", "register_dialect", "get_dialect", "list_dialects", "Sniffer", - "unregister_dialect", "__version__", "DictReader", "DictWriter", - "unix_dialect"] + "unregister_dialect", "__version__", "TableReader", "DictReader", + "DictWriter", "unix_dialect"] class Dialect: """Describe a CSV dialect. @@ -78,7 +78,7 @@ class unix_dialect(Dialect): register_dialect("unix", unix_dialect) -class DictReader: +class TableReader: def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect="excel", *args, **kwds): self._fieldnames = fieldnames # list of keys for the dict @@ -117,17 +117,22 @@ def __next__(self): # values while row == []: row = next(self.reader) - d = OrderedDict(zip(self.fieldnames, row)) + d = list(zip(self.fieldnames, row)) lf = len(self.fieldnames) lr = len(row) if lf < lr: - d[self.restkey] = row[lf:] + d.append((self.restkey, row[lf:])) elif lf > lr: for key in self.fieldnames[lr:]: - d[key] = self.restval + d.append((key, self.restval)) return d +class DictReader(TableReader): + def __next__(self): + return OrderedDict(super().__next__()) + + class DictWriter: def __init__(self, f, fieldnames, restval="", extrasaction="raise", dialect="excel", *args, **kwds):