=== modified file 'Lib/csv.py' --- Lib/csv.py 2008-04-24 18:26:53 +0000 +++ Lib/csv.py 2008-07-31 15:11:00 +0000 @@ -68,7 +68,7 @@ class DictReader: def __init__(self, f, fieldnames=None, restkey=None, restval=None, dialect="excel", *args, **kwds): - self.fieldnames = fieldnames # list of keys for the dict + 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, **kwds) @@ -78,11 +78,24 @@ def __iter__(self): return self + @property + def fieldnames(self): + if self._fieldnames is None: + try: + self._fieldnames = next(self.reader) + except StopIteration: + pass + self.line_num = self.reader.line_num + return self._fieldnames + + @fieldnames.setter + def fieldnames(self, fieldnames): + self._fieldnames = fieldnames + def __next__(self): + if self.line_num == 0: + self.fieldnames row = next(self.reader) - if self.fieldnames is None: - self.fieldnames = row - row = next(self.reader) self.line_num = self.reader.line_num # unlike the basic reader, we prefer not to return blanks, === modified file 'Lib/test/test_csv.py' --- Lib/test/test_csv.py 2008-05-20 21:35:26 +0000 +++ Lib/test/test_csv.py 2008-07-31 15:09:30 +0000 @@ -543,6 +543,7 @@ fileobj.write("f1,f2,f3\r\n1,2,abc\r\n") fileobj.seek(0) reader = csv.DictReader(fileobj) + self.assertEqual(reader.fieldnames, ["f1", "f2", "f3"]) self.assertEqual(next(reader), {"f1": '1', "f2": '2', "f3": 'abc'}) def test_read_long(self): @@ -568,6 +569,7 @@ fileobj.write("f1,f2\r\n1,2,abc,4,5,6\r\n") fileobj.seek(0) reader = csv.DictReader(fileobj, restkey="_rest") + self.assertEqual(reader.fieldnames, ["f1", "f2"]) self.assertEqual(next(reader), {"f1": '1', "f2": '2', "_rest": ["abc", "4", "5", "6"]})