Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 49d1302

Browse files
committed
merge 3.2: Issue #16013: Fix CSV Reader parsing issue with ending quote characters. Patch by Serhiy Storchaka.
2 parents 9118a79 + 67b7b98 commit 49d1302

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

Lib/test/test_csv.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ def test_read_eol(self):
225225
self.assertRaises(csv.Error, self._read_test, ['a,b\nc,d'], [])
226226
self.assertRaises(csv.Error, self._read_test, ['a,b\r\nc,d'], [])
227227

228+
def test_read_eof(self):
229+
self._read_test(['a,"'], [['a', '']])
230+
self._read_test(['"a'], [['a']])
231+
self._read_test(['^'], [['\n']], escapechar='^')
232+
self.assertRaises(csv.Error, self._read_test, ['a,"'], [], strict=True)
233+
self.assertRaises(csv.Error, self._read_test, ['"a'], [], strict=True)
234+
self.assertRaises(csv.Error, self._read_test,
235+
['^'], [], escapechar='^', strict=True)
236+
228237
def test_read_escape(self):
229238
self._read_test(['a,\\b,c'], [['a', 'b', 'c']], escapechar='\\')
230239
self._read_test(['a,b\\,c'], [['a', 'b,c']], escapechar='\\')

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ Core and Builtins
3131
Library
3232
-------
3333

34+
- Issue #16013: Fix CSV Reader parsing issue with ending quote characters.
35+
Patch by Serhiy Storchaka.
36+
3437
- Issue #15421: Fix an OverflowError in Calendar.itermonthdates() after
3538
datetime.MAXYEAR. Patch by Cédric Krier.
3639

Modules/_csv.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -788,9 +788,14 @@ Reader_iternext(ReaderObj *self)
788788
lineobj = PyIter_Next(self->input_iter);
789789
if (lineobj == NULL) {
790790
/* End of input OR exception */
791-
if (!PyErr_Occurred() && self->field_len != 0)
792-
PyErr_Format(_csvstate_global->error_obj,
793-
"newline inside string");
791+
if (!PyErr_Occurred() && (self->field_len != 0 ||
792+
self->state == IN_QUOTED_FIELD)) {
793+
if (self->dialect->strict)
794+
PyErr_SetString(_csvstate_global->error_obj,
795+
"unexpected end of data");
796+
else if (parse_save_field(self) >= 0)
797+
break;
798+
}
794799
return NULL;
795800
}
796801
if (!PyUnicode_Check(lineobj)) {

0 commit comments

Comments
 (0)