"""Python 3.10+; validate a CSV header before creating dictionaries.""" import csv import io import unittest def checked_rows(text, required): reader = csv.reader(io.StringIO(text, newline=""), strict=True) header = next(reader, None) if header is None or not header or any(not name for name in header): raise ValueError("missing or empty header") if len(header) != len(set(header)): raise ValueError("duplicate header") if not set(required) <= set(header): raise ValueError("required columns missing") result = [] for row in reader: if len(row) != len(header): raise ValueError(f"wrong field count near physical line {reader.line_num}") result.append(dict(zip(header, row))) return result class HeaderTests(unittest.TestCase): def test_reordered_columns_and_quoted_data(self): text = 'note,id\n"a,b",007\n' self.assertEqual(checked_rows(text, {"id"}), [{"note": "a,b", "id": "007"}]) def test_bad_headers_and_widths(self): for text in ("", "id,id\n1,2\n", "id,\n1,2\n", "name\nAda\n", "id,name\n1\n", "id,name\n1,Ada,extra\n"): with self.subTest(text=text), self.assertRaises(ValueError): checked_rows(text, {"id"}) if __name__ == "__main__": unittest.main()