Skip to content

Commit

Permalink
bpo-32255: Always quote a single empty field when write into a CSV fi…
Browse files Browse the repository at this point in the history
…le. (GH-4769) (#4810)

This allows to distinguish an empty row from a row consisting of a single empty field.
(cherry picked from commit 2001900)
  • Loading branch information
miss-islington authored and serhiy-storchaka committed Dec 12, 2017
1 parent 82adaf5 commit ce5a3cd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 2 deletions.
21 changes: 20 additions & 1 deletion Lib/test/test_csv.py
Expand Up @@ -207,10 +207,29 @@ def write(self, buf):
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
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Expand Up @@ -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
Expand Down
@@ -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.
2 changes: 1 addition & 1 deletion Modules/_csv.c
Expand Up @@ -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");
Expand Down

0 comments on commit ce5a3cd

Please sign in to comment.