A row with the wrong number of fields loads without complaint
name,city
Smith, John,Leeds
The name contains an unquoted comma, so that row has three fields against a two-field header. pandas pads or throws depending on the engine, Excel shifts the columns, and split(",") mis-assigns every field after the extra one. Nothing errors, and nobody notices until a number is wrong in a report. Quote the field: "Smith, John".
csv.ragged_row · run this example
A European CSV read as comma-separated is one column of nonsense
name;price
widget;1,50
Wherever the comma is the decimal separator, CSV exports are semicolon-separated. Read as comma-separated, the file has one column and every value is wrong — with no error at all. The delimiter is sniffed from the header, ignoring quoted regions, and always reported so the assumption is visible.
csv.ambiguous_delimiter · run this example
One unclosed quote makes thousands of rows look broken
a,b
"never closed,2
3,4
An unclosed quote swallows the remainder of the file into a single field. The symptom is thousands of ragged rows and a row count far lower than the file length suggests. Fix the quote first and re-validate; the rest usually resolves.
csv.unterminated_quote · run this example
A BOM makes the first column impossible to look up
id,name
1,gumball
The BOM becomes part of the first header name, so the column is called "\ufeffid" and a lookup for "id" returns nothing — while the two print identically. Excel adds this when saving as CSV UTF-8. In Python, read with encoding="utf-8-sig".
csv.byte_order_mark · run this example
Two columns with the same name, resolved differently everywhere
id,name,id
1,gumball,2
pandas renames the second to "id.1", csv.DictReader keeps only the last, and a hand-written mapper silently overwrites. Position-based readers are unaffected, which is exactly why this survives testing and fails in the one consumer that addresses columns by name.
csv.duplicate_column_name · run this example
A column name with a leading space
id, name,city
1,gumball,Leeds
Most parsers keep the space, so the column is " name" and a lookup for "name" misses it. Indistinguishable on screen from the correct file.
csv.padded_column_name · run this example