Какие способы экранирования существуют в CSV?
Что проверяют
Знаете ли вы правила RFC 4180 и понимаете, почему CSV нельзя разбирать через split(','). Следом часто просят написать разбор строки с кавычками вручную или показать настройки модуля csv.
Как отвечать
Правила RFC 4180:
- обрамление кавычками: поле с разделителем, двойной кавычкой или переводом строки заключается в двойные кавычки;
- удвоение кавычки: кавычка внутри такого поля пишется дважды,
"He said ""hi"""читается какHe said "hi"; - перевод строки в поле: допустим внутри кавычек, поэтому одна запись может занимать несколько строк файла.
Альтернатива стандарту это экранирующий символ, обычно обратный слэш. Так устроен текстовый формат COPY в PostgreSQL, а режим CSV там следует кавычкам.
В модуле csv это параметры диалекта:
quoting: по умолчаниюQUOTE_MINIMAL. ЕстьQUOTE_ALL,QUOTE_NONNUMERIC,QUOTE_NONE, а с Python 3.12 ещёQUOTE_STRINGSиQUOTE_NOTNULL;doublequote:Trueпо умолчанию, то есть удвоение. ПриFalseнуженescapechar;escapechar: обязателен приQUOTE_NONE, иначе поле с разделителем падает сcsv.Error;delimiter: для русского Excel обычно;, запятая там десятичный знак.
Файл открывайте с newline='', иначе переносы внутри полей сломаются, а на Windows появятся пустые строки. Для Excel кодировка utf-8-sig.
Парсер вручную это конечный автомат из трёх состояний: вне кавычек, внутри кавычек, «встретили кавычку внутри кавычек». В последнем вторая кавычка означает символ, а разделитель конец поля.
Где спотыкаются
Оборачивают значения в кавычки сами и передают их в csv.writer. Модуль экранирует их ещё раз, и в файле оказывается """Smith, John""".
Читают файл через for line in f и split. Первое же поле с переносом строки рвёт запись пополам.
Забывают про CSV-инъекцию: значение, начинающееся с =, +, - или @, Excel выполнит как формулу. В выгрузках для людей такие ячейки экранируют апострофом.