prevents blank-row bugs from newline translation - `csv.reader` — rows as lists; positional access only; brittle when columns change - `csv.DictReader` — rows as dicts keyed by header; recommended for all business use - `csv.writer` — write rows as lists - `csv.DictWriter` — write rows as dicts; req