]> granicus.if.org Git - python/commitdiff
Issue #16013: Fix CSV Reader parsing issue with ending quote characters. Patch by...
authorSenthil Kumaran <senthil@uthcode.com>
Tue, 25 Sep 2012 09:30:27 +0000 (02:30 -0700)
committerSenthil Kumaran <senthil@uthcode.com>
Tue, 25 Sep 2012 09:30:27 +0000 (02:30 -0700)
Lib/test/test_csv.py
Misc/NEWS
Modules/_csv.c

index 8ca1e62c4ae0200414d066a209ee5063f6d52de1..55796a204ade902cc3d9a4ece0c7fd724b5dcdcd 100644 (file)
@@ -225,6 +225,15 @@ class Test_Csv(unittest.TestCase):
         self.assertRaises(csv.Error, self._read_test, ['a,b\nc,d'], [])
         self.assertRaises(csv.Error, self._read_test, ['a,b\r\nc,d'], [])
 
+    def test_read_eof(self):
+        self._read_test(['a,"'], [['a', '']])
+        self._read_test(['"a'], [['a']])
+        self._read_test(['^'], [['\n']], escapechar='^')
+        self.assertRaises(csv.Error, self._read_test, ['a,"'], [], strict=True)
+        self.assertRaises(csv.Error, self._read_test, ['"a'], [], strict=True)
+        self.assertRaises(csv.Error, self._read_test,
+                          ['^'], [], escapechar='^', strict=True)
+
     def test_read_escape(self):
         self._read_test(['a,\\b,c'], [['a', 'b', 'c']], escapechar='\\')
         self._read_test(['a,b\\,c'], [['a', 'b,c']], escapechar='\\')
index 3283117d6199dab07fcbbf8abc8a1140257a9f5e..ab3c7d447a8084bb44c3f549edd01e5180863cea 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -123,6 +123,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #16013: Fix CSV Reader parsing issue with ending quote characters.
+  Patch by Serhiy Storchaka.
+
 - Issue #15421: fix an OverflowError in Calendar.itermonthdates() after
   datetime.MAXYEAR.  Patch by Cédric Krier.
 
index 6c564d727bbbb7acf2176a0351eff5b63dbd6baa..88d4f9774fa1b8c0d23f66c611d7888a23a4b6b7 100644 (file)
@@ -759,9 +759,13 @@ Reader_iternext(ReaderObj *self)
         lineobj = PyIter_Next(self->input_iter);
         if (lineobj == NULL) {
             /* End of input OR exception */
-            if (!PyErr_Occurred() && self->field_len != 0)
-                PyErr_Format(error_obj,
-                             "newline inside string");
+            if (!PyErr_Occurred() && (self->field_len != 0 ||
+                                      self->state == IN_QUOTED_FIELD)) {
+                if (self->dialect->strict)
+                    PyErr_SetString(error_obj, "unexpected end of data");
+                else if (parse_save_field(self) >= 0)
+                    break;
+            }
             return NULL;
         }
         if (!PyUnicode_Check(lineobj)) {