summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2018-02-09 22:02:04 (GMT)
committerGitHub <noreply@github.com>2018-02-09 22:02:04 (GMT)
commite7197936c987bdf31b6b7b1dab275d1a762e03b3 (patch)
tree3db259fcd5b6d608a91b93db6e678850d082b88a
parent672fd7d8162f76aff8423fa5c7bfd2b1e91faf57 (diff)
downloadcpython-e7197936c987bdf31b6b7b1dab275d1a762e03b3.zip
cpython-e7197936c987bdf31b6b7b1dab275d1a762e03b3.tar.gz
cpython-e7197936c987bdf31b6b7b1dab275d1a762e03b3.tar.bz2
[2.7] bpo-30157: Fix csv.Sniffer.sniff() regex pattern. (GH-5601) (GH-5604)
Co-authored-by: Jake Davis <jcdavis@awedge.net>. (cherry picked from commit 2411292ba8155327125d8a1da8a4c9fa003d5909)
-rw-r--r--Lib/csv.py2
-rw-r--r--Lib/test/test_csv.py9
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst2
4 files changed, 13 insertions, 1 deletions
diff --git a/Lib/csv.py b/Lib/csv.py
index c155ada..70c53ae 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -217,7 +217,7 @@ class Sniffer:
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 d456759..88d5af7 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -1036,6 +1036,15 @@ Stonecutters Seafood and Chop House+ Lemont+ IL+ 12/19/02+ Week Back
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 dc64293..f0a115d 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 0000000..9f65193
--- /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.