Какое свойство сепаратора можно использовать для определения его в CSV файле?
Что проверяют
Знаете ли вы стандартный модуль csv и pandas настолько, чтобы не писать разбор руками. Правильное слово здесь delimiter: атрибут диалекта в модуле csv и параметр sep (он же delimiter) в pandas.read_csv. Следом обычно спрашивают, что делать, если разделитель заранее неизвестен.
Как отвечать
Сначала про явное задание:
csv.reader(f, delimiter=";"): разделитель из одного символа. Рядом живутquotechar,escapechar,doublequote,skipinitialspace, всё это атрибутыcsv.Dialect;pd.read_csv(path, sep=";"): то же в pandas. Разделитель длиннее одного символа (кроме\s+) pandas считает регулярным выражением и переключается на медленныйengine="python".
Если разделитель неизвестен, в стандартной библиотеке есть csv.Sniffer:
with open(path, newline="", encoding="utf-8-sig") as f:
dialect = csv.Sniffer().sniff(f.read(65536), delimiters=",;\t|")
f.seek(0)
rows = list(csv.reader(f, dialect))Найденный разделитель лежит в dialect.delimiter. Список delimiters заметно повышает точность, а Sniffer().has_header(sample) подскажет, есть ли строка заголовков. В pandas то же делает read_csv(path, sep=None, engine="python"), внутри работает тот же Sniffer.
Упомяните контекст: выгрузки Excel в русской локали обычно идут через ;, потому что запятая занята дробной частью, и часто с BOM, отсюда utf-8-sig.
Где спотыкаются
Режут строку через line.split(","). Первое же поле в кавычках с запятой внутри ломает разбор, модуль csv такие поля понимает.
Определяют разделитель подсчётом символов: какой встретился, тот и выбран. Запятая в тексте перевешивает настоящий ;. Sniffer смотрит, одинаково ли число полей в строках.
Забывают newline="" при открытии файла, хотя его требует документация: без него переносы строк внутри полей в кавычках обрабатываются неверно. И не ловят csv.Error: Could not determine delimiter, которое Sniffer бросает на коротком или однородном образце.