From e6f9e161147a87767c4f7cf18a10895790f4ce2d Mon Sep 17 00:00:00 2001 From: Andy Terrel Date: Mon, 19 May 2025 09:27:23 -0400 Subject: [PATCH 1/3] gh-119123: Fix sniffer to understand csv lists --- Lib/csv.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/csv.py b/Lib/csv.py index 0a627ba7a512fa8..c593e635aa5ca1e 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -282,6 +282,9 @@ def _guess_quote_and_delimiter(self, data, delimiters): """ import re + # Remove lists from the data, see issue 119123 + data = re.sub(r'\[.*?\]', '', data) + matches = [] for restr in (r'(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?P=delim)', # ,".*?", r'(?:^|\n)(?P["\']).*?(?P=quote)(?P[^\w\n"\'])(?P ?)', # ".*?", From cbbcf1c87bfd87cccafbe2c30b93f5c7ddd0f749 Mon Sep 17 00:00:00 2001 From: Andy Terrel Date: Mon, 19 May 2025 10:43:59 -0400 Subject: [PATCH 2/3] gh-119123: adds test for failing csv lists --- Lib/test/test_csv.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 9aace57633b0c64..5ea187517a4fd6c 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -1331,10 +1331,21 @@ class TestSniffer(unittest.TestCase): ghi\0jkl """ + sample15 = dedent("""\ + id;field1;group;sub_group + 1;False;['345'];['10'] + 2;False;['112', '112'];['765', '766'] + """) + def test_issue43625(self): sniffer = csv.Sniffer() self.assertTrue(sniffer.has_header(self.sample12)) self.assertFalse(sniffer.has_header(self.sample13)) + + def test_issue119123(self): + sniffer = csv.Sniffer() + dialect = sniffer.sniff(self.sample15, ",;") + self.assertEqual(dialect.delimiter, ';') def test_has_header_strings(self): "More to document existing (unexpected?) behavior than anything else." From eef30e654a05d3347d0f210caf238d9cfdb7efef Mon Sep 17 00:00:00 2001 From: Andy Terrel Date: Mon, 19 May 2025 11:01:00 -0400 Subject: [PATCH 3/3] fix whitespace issues --- Lib/test/test_csv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 5ea187517a4fd6c..c6340d8e1b70f3f 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -1341,7 +1341,7 @@ def test_issue43625(self): sniffer = csv.Sniffer() self.assertTrue(sniffer.has_header(self.sample12)) self.assertFalse(sniffer.has_header(self.sample13)) - + def test_issue119123(self): sniffer = csv.Sniffer() dialect = sniffer.sniff(self.sample15, ",;")