bpo-32255: Always quote a single empty field when write into a CSV file. (GH-4769) (#4810)

This allows to distinguish an empty row from a row consisting of a single empty field.
(cherry picked from commit 2001900b0c)
This commit is contained in:
Miss Islington (bot) 2017-12-12 02:56:40 -08:00 committed by Serhiy Storchaka
parent 82adaf5ffe
commit ce5a3cd9b1
4 changed files with 25 additions and 2 deletions

View file

@ -207,10 +207,29 @@ class Test_Csv(unittest.TestCase):
with TemporaryFile("w+", newline='') as fileobj: with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj) writer = csv.writer(fileobj)
self.assertRaises(TypeError, writer.writerows, None) self.assertRaises(TypeError, writer.writerows, None)
writer.writerows([['a','b'],['c','d']]) writer.writerows([['a', 'b'], ['c', 'd']])
fileobj.seek(0) fileobj.seek(0)
self.assertEqual(fileobj.read(), "a,b\r\nc,d\r\n") self.assertEqual(fileobj.read(), "a,b\r\nc,d\r\n")
def test_writerows_with_none(self):
with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj)
writer.writerows([['a', None], [None, 'd']])
fileobj.seek(0)
self.assertEqual(fileobj.read(), "a,\r\n,d\r\n")
with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj)
writer.writerows([[None], ['a']])
fileobj.seek(0)
self.assertEqual(fileobj.read(), '""\r\na\r\n')
with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj)
writer.writerows([['a'], [None]])
fileobj.seek(0)
self.assertEqual(fileobj.read(), 'a\r\n""\r\n')
@support.cpython_only @support.cpython_only
def test_writerows_legacy_strings(self): def test_writerows_legacy_strings(self):
import _testcapi import _testcapi

View file

@ -1525,6 +1525,7 @@ Joel Taddei
Arfrever Frehtes Taifersar Arahesis Arfrever Frehtes Taifersar Arahesis
Hideaki Takahashi Hideaki Takahashi
Takase Arihiro Takase Arihiro
Licht Takeuchi
Indra Talip Indra Talip
Neil Tallim Neil Tallim
Geoff Talvola Geoff Talvola

View file

@ -0,0 +1,3 @@
A single empty field is now always quoted when written into a CSV file.
This allows to distinguish an empty row from a row consisting of a single empty field.
Patch by Licht Takeuchi.

View file

@ -1245,7 +1245,7 @@ csv_writerow(WriterObj *self, PyObject *seq)
if (PyErr_Occurred()) if (PyErr_Occurred())
return NULL; return NULL;
if (self->num_fields > 0 && self->rec_size == 0) { if (self->num_fields > 0 && self->rec_len == 0) {
if (dialect->quoting == QUOTE_NONE) { if (dialect->quoting == QUOTE_NONE) {
PyErr_Format(_csvstate_global->error_obj, PyErr_Format(_csvstate_global->error_obj,
"single empty field record must be quoted"); "single empty field record must be quoted");