summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-30 06:09:54 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-30 06:09:54 (GMT)
commit7901b48a1f89b9bfa9d111ae3725400b466a9baa (patch)
tree4cebbcaeeb7b1f29f5440c7762f55bf3a57c0c54 /Lib
parenta695f83f0de060a77352174be8a5c6f6500ab98a (diff)
downloadcpython-7901b48a1f89b9bfa9d111ae3725400b466a9baa.zip
cpython-7901b48a1f89b9bfa9d111ae3725400b466a9baa.tar.gz
cpython-7901b48a1f89b9bfa9d111ae3725400b466a9baa.tar.bz2
Issue #23171: csv.Writer.writerow() now supports arbitrary iterables.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/csv.py7
-rw-r--r--Lib/test/test_csv.py8
2 files changed, 10 insertions, 5 deletions
diff --git a/Lib/csv.py b/Lib/csv.py
index c3c31f0..ca40e5e 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -147,16 +147,13 @@ class DictWriter:
if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: "
+ ", ".join([repr(x) for x in wrong_fields]))
- return [rowdict.get(key, self.restval) for key in self.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)
+ return self.writer.writerows(map(self._dict_to_list, rowdicts))
# Guard Sniffer's type checking against builds that exclude complex()
try:
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 41ef790..7be3cc3 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -186,6 +186,14 @@ class Test_Csv(unittest.TestCase):
self._write_test(['a',1,'p,q'], 'a,1,p\\,q',
escapechar='\\', quoting = csv.QUOTE_NONE)
+ def test_write_iterable(self):
+ self._write_test(iter(['a', 1, 'p,q']), 'a,1,"p,q"')
+ self._write_test(iter(['a', 1, None]), 'a,1,')
+ self._write_test(iter([]), '')
+ self._write_test(iter([None]), '""')
+ self._write_error_test(csv.Error, iter([None]), quoting=csv.QUOTE_NONE)
+ self._write_test(iter([None, None]), ',')
+
def test_writerows(self):
class BrokenFile:
def write(self, buf):