From 2411292ba8155327125d8a1da8a4c9fa003d5909 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 9 Feb 2018 20:00:49 +0200 Subject: [PATCH] bpo-30157: Fix csv.Sniffer.sniff() regex pattern. (GH-5601) Co-authored-by: Jake Davis --- Lib/csv.py | 2 +- Lib/test/test_csv.py | 10 ++++++++++ Misc/ACKS | 1 + .../Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2018-02-09-14-44-43.bpo-30157.lEiiAK.rst diff --git a/Lib/csv.py b/Lib/csv.py index 6a8587674f..58624af905 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -217,7 +217,7 @@ class Sniffer: matches = [] for restr in (r'(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?P=delim)', # ,".*?", r'(?:^|\n)(?P["\']).*?(?P=quote)(?P[^\w\n"\'])(?P ?)', # ".*?", - r'(?P>[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?:$|\n)', # ,".*?" + r'(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?:$|\n)', # ,".*?" r'(?:^|\n)(?P["\']).*?(?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 fe248019a0..b65cbf6a50 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -986,6 +986,16 @@ 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'"): + with self.subTest(header): + 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 4c8b86ac45..b31190ca52 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -355,6 +355,7 @@ Kushal Das Jonathan Dasteel Pierre-Yves David A. Jesse Jiryu Davis +Jake Davis Ratnadeep Debnath Merlijn van Deen John DeGood 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 0000000000..9f651930ac --- /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. -- 2.40.0