[Python-checkins] [2.7] bpo-30157: Fix csv.Sniffer.sniff() regex pattern. (GH-5601) (GH-5604)

Serhiy Storchaka webhook-mailer at python.org
Fri Feb 9 17:02:07 EST 2018


https://github.com/python/cpython/commit/e7197936c987bdf31b6b7b1dab275d1a762e03b3
commit: e7197936c987bdf31b6b7b1dab275d1a762e03b3
branch: 2.7
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018-02-10T00:02:04+02:00
summary:

[2.7] bpo-30157: Fix csv.Sniffer.sniff() regex pattern. (GH-5601) (GH-5604)

Co-authored-by: Jake Davis <jcdavis at awedge.net>.
(cherry picked from commit 2411292ba8155327125d8a1da8a4c9fa003d5909)

files:
A Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst
M Lib/csv.py
M Lib/test/test_csv.py
M Misc/ACKS

diff --git a/Lib/csv.py b/Lib/csv.py
index c155ada794a6..70c53ae7791e 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -217,7 +217,7 @@ def _guess_quote_and_delimiter(self, data, delimiters):
         matches = []
         for restr in ('(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?P=delim)', # ,".*?",
                       '(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?P<delim>[^\w\n"\'])(?P<space> ?)',   #  ".*?",
-                      '(?P<delim>>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?:$|\n)',  # ,".*?"
+                      '(?P<delim>[^\w\n"\'])(?P<space> ?)(?P<quote>["\']).*?(?P=quote)(?:$|\n)',   # ,".*?"
                       '(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?:$|\n)'):                            #  ".*?" (no delim, no space)
             regexp = re.compile(restr, re.DOTALL | re.MULTILINE)
             matches = regexp.findall(data)
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index d4567590cb1d..88d5af7c130d 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -1036,6 +1036,15 @@ def test_has_header_regex_special_delimiter(self):
         self.assertEqual(sniffer.has_header(self.header2 + self.sample8),
                          True)
 
+    def test_guess_quote_and_delimiter(self):
+        sniffer = csv.Sniffer()
+        for header in (";'123;4';", "'123;4';", ";'123;4'", "'123;4'"):
+            dialect = sniffer.sniff(header, ",;")
+            self.assertEqual(dialect.delimiter, ';')
+            self.assertEqual(dialect.quotechar, "'")
+            self.assertIs(dialect.doublequote, False)
+            self.assertIs(dialect.skipinitialspace, False)
+
     def test_sniff(self):
         sniffer = csv.Sniffer()
         dialect = sniffer.sniff(self.sample1)
diff --git a/Misc/ACKS b/Misc/ACKS
index dc64293b6965..f0a115d5d555 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -317,6 +317,7 @@ Kushal Das
 Jonathan Dasteel
 Pierre-Yves David
 A. Jesse Jiryu Davis
+Jake Davis
 Merlijn van Deen
 John DeGood
 Ned Deily
diff --git a/Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst b/Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst
new file mode 100644
index 000000000000..9f651930ac2b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst
@@ -0,0 +1,2 @@
+Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last
+field is quoted.  Patch by Jake Davis.



More information about the Python-checkins mailing list