]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-113785: csv: fields starting with escapechar are not quoted (GH-122110...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 9 Aug 2024 16:04:29 +0000 (18:04 +0200)
committerGitHub <noreply@github.com>
Fri, 9 Aug 2024 16:04:29 +0000 (16:04 +0000)
(cherry picked from commit a3327dbfd4db9e5ad1ca514963d503abbbbfede7)

Co-authored-by: MikoĊ‚aj Kuranowski <mkuranowski@gmail.com>
Lib/test/test_csv.py
Misc/NEWS.d/next/Library/2024-07-22-08-14-04.gh-issue-113785.6B_KNB.rst [new file with mode: 0644]
Modules/_csv.c

index adb89d0df926c69455f6233214571ad6dbf1ca23..57db59185d97f750a9fe82d4e6577c33fc423330 100644 (file)
@@ -425,6 +425,8 @@ class Test_Csv(unittest.TestCase):
                           quoting=csv.QUOTE_NONNUMERIC)
         self._read_test(['1,@,3,@,5'], [['1', ',3,', '5']], quotechar='@')
         self._read_test(['1,\0,3,\0,5'], [['1', ',3,', '5']], quotechar='\0')
+        self._read_test(['1\\.5,\\.5,.5'], [[1.5, 0.5, 0.5]],
+                        quoting=csv.QUOTE_NONNUMERIC, escapechar='\\')
 
     def test_read_skipinitialspace(self):
         self._read_test(['no space, space,  spaces,\ttab'],
diff --git a/Misc/NEWS.d/next/Library/2024-07-22-08-14-04.gh-issue-113785.6B_KNB.rst b/Misc/NEWS.d/next/Library/2024-07-22-08-14-04.gh-issue-113785.6B_KNB.rst
new file mode 100644 (file)
index 0000000..c111874
--- /dev/null
@@ -0,0 +1 @@
+:mod:`csv` now correctly parses numeric fields (when used with :const:`csv.QUOTE_NONNUMERIC`) which start with an escape character.
index d63eac1bf7a2227f8176254c6b46c6a2f80b7e4b..9a7b7d27c2ed39a7b693aa0b44e3ce45de44d13c 100644 (file)
@@ -701,6 +701,8 @@ parse_process_char(ReaderObj *self, _csvstate *module_state, Py_UCS4 c)
         }
         else if (c == dialect->escapechar) {
             /* possible escaped character */
+            if (dialect->quoting == QUOTE_NONNUMERIC)
+                self->numeric_field = 1;
             self->state = ESCAPED_CHAR;
         }
         else if (c == ' ' && dialect->skipinitialspace)