CSV — это обычный текстовый файл с таблицей внутри: каждая строка файла хранит одну строку таблицы, а значения в ней разделены запятой или точкой с запятой. Открыть его можно в Excel через «Данные» → «Из текстового/CSV-файла», в Google Таблицах через «Файл» → «Импорт», а в Python прочитать модулем csv или функцией pandas.read_csv().
Ниже разберём, как устроен формат, почему русский Excel показывает CSV одной колонкой или кракозябрами и как читать и записывать такие файлы в Python, чтобы их потом без сюрпризов открыл любой табличный редактор. Если вы только выбираете, в чём хранить данные, сначала посмотрите разбор форматов Excel и статью о том, что такое JSON: это два соседних способа передать ту же таблицу.
Что такое CSV-файл и как он устроен

Название расшифровывается как Comma-Separated Values, то есть «значения, разделённые запятыми». Расширение у файла .csv, но внутри нет ни формул, ни шрифтов, ни нескольких листов. Только текст.
Вот небольшой файл с заказами, на нём построены все примеры этой статьи:
id,client,city,amount,date
1,Анна,Казань,12500.50,2026-10-01
2,"ООО ""Ромашка""",Москва,48000,2026-10-02
3,Игорь,"Нижний Новгород, Сормово",3990,2026-10-03
Первая строка — заголовки столбцов, дальше по строке на каждый заказ. Значения с запятой внутри («Нижний Новгород, Сормово») взяты в двойные кавычки, иначе программа решила бы, что это два поля.
Правила формата
Единого обязательного стандарта у CSV нет. Чаще всего ссылаются на RFC 4180, но у этого документа статус Informational: он описывает формат и прямо оговаривает, что стандартом не является. Основное оттуда:
- каждая запись стоит на отдельной строке, строки разделяет перевод строки CRLF;
- строка заголовков в начале файла необязательна;
- поля разделяются запятыми, после последнего поля запятой нет;
- поле с запятой, кавычкой или переводом строки берётся в двойные кавычки;
- кавычка внутри такого поля удваивается:
"ООО ""Ромашка"""; - тип файла для интернета зарегистрирован как
text/csv.
Именно из-за отсутствия жёсткого стандарта программы пишут CSV немного по-разному. Отсюда почти все проблемы, о которых пойдёт речь ниже.
Какие бывают разделители
| Разделитель | Где встречается | Как указать в Python |
|---|---|---|
Запятая , |
выгрузки сервисов, API, англоязычный Excel | по умолчанию |
Точка с запятой ; |
Excel с русскими региональными настройками, 1С, банковские выписки | delimiter=";" |
| Табуляция | файлы .tsv, копирование из таблиц |
delimiter="\t" |
Вертикальная черта | |
логи и выгрузки из баз данных | delimiter="|" |
Точка с запятой в русской среде появилась не случайно: запятая у нас занята под десятичную дробь. Число «12500,50» в файле с запятыми-разделителями развалилось бы на два поля.
Как открыть CSV-файл
Двойной щелчок по файлу обычно открывает его в Excel, и для простых выгрузок этого хватает. Если же столбцы слиплись или вместо букв видны значки, файл нужно не открывать, а импортировать с явным выбором разделителя и кодировки.
В Excel
- Создайте пустую книгу и перейдите на вкладку «Данные».
- В группе «Получение и преобразование данных» нажмите «Из текстового/CSV-файла» и выберите файл.
- В окне предпросмотра проверьте три поля: «Источник файла» (кодировка, для современных выгрузок — UTF-8), «Разделитель» и способ определения типов данных.
- Нажмите «Загрузить», чтобы данные легли на новый лист, или «Преобразовать данные», чтобы сначала поправить их в Power Query.
Подробности по шагам есть в справке Microsoft об импорте текстовых файлов, а про поле «Источник файла» и выбор разделителя — в документации Power Query. В документации Power Query есть важная деталь: кодировку он сам не угадывает и UTF-8 распознаёт, только если файл начинается с метки BOM. Лимит у листа тот же, что всегда: 1 048 576 строк и 16 384 столбца.
Обратная операция — «Файл» → «Сохранить как» и тип «CSV (разделители — запятые)». Сохранится только текущий лист, всё форматирование пропадёт. Повторяющиеся строки лучше убрать до сохранения, пока таблица ещё книга Excel: вот шесть способов удалить дубликаты. Если таблица выгружена из базы, удобнее сразу брать CSV оттуда: вот как это делается в DBeaver.
В Google Таблицах
Путь для файла с диска: «Файл» → «Импорт», выбрать файл, затем в поле «Разделитель» выбрать «Определять автоматически», «Табуляция», «Запятая» или «Другой» (справка Google). Если же CSV уже вставили на лист и он лёг одной колонкой, его можно разрезать на месте. Это удобно показать по шагам, кадры ниже сделаны в Google Таблицах; в Excel тот же приём называется «Данные» → «Текст по столбцам».
Вставляем в ячейку A1 выгрузку с точкой с запятой. Каждая строка файла попадает в одну ячейку:

Выделяем заполненные ячейки столбца A и открываем меню «Данные» → «Разделить текст на столбцы»:

Таблицы сами подбирают разделитель и ошибаются: в нашем файле они выбрали запятую. Сумма «12500,50» разрезана на «12500» и «50», город «Нижний Новгород, Сормово» тоже распался.

Решение: в появившейся плашке «Разделитель» раскрыть список и выбрать «Точка с запятой» вместо «Определять автоматически».

Теперь у каждого значения своя колонка. Обратите внимание на сумму в строке 2: «12500,50» прижата влево, то есть осталась текстом. Формат чисел по умолчанию задают региональные настройки таблицы («Файл» → «Настройки таблицы»), а у нашей учебной таблицы они англоязычные, где дробную часть отделяет точка. Если у вас так же, поменяйте регион на «Россия» до разделения.

Другие способы
- LibreOffice Calc при открытии CSV сразу показывает окно импорта с выбором кодировки и разделителя. Это самый спокойный бесплатный вариант для файлов в Windows-1251.
- Блокнот, VS Code, любой текстовый редактор покажут файл как есть. Так быстрее всего понять, какой в нём разделитель и нет ли лишних кавычек.
- Excel в браузере открывает CSV так же, как десктопная версия, если программы на компьютере нет. Как до него добраться, рассказано в статье об Excel онлайн.
- Онлайн-просмотрщики годятся для разового взгляда, но загружать туда выгрузку с персональными данными клиентов не стоит.
Как прочитать CSV в Python
Для работы с CSV ничего ставить не нужно: модуль csv входит в стандартную библиотеку. Если Python у вас ещё не установлен, начните с инструкции как скачать Python. Все примеры ниже запускались на Python 3.14, вывод в статье — настоящий.
Построчно: csv.reader
import csv
with open("orders.csv", newline="", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
['id', 'client', 'city', 'amount', 'date']
['1', 'Анна', 'Казань', '12500.50', '2026-10-01']
['2', 'ООО "Ромашка"', 'Москва', '48000', '2026-10-02']
['3', 'Игорь', 'Нижний Новгород, Сормово', '3990', '2026-10-03']
Кавычки и запятые внутри полей модуль разобрал сам. Каждая строка приходит списком строк: числа тоже остаются текстом, их нужно переводить через int() или float(). Самодельный разбор через line.split(",") на третьей строке сломался бы. Чем split() полезен в других задачах, разобрано в статье о превращении строки в список.
Параметр newline="" в open() ставьте всегда. По документации модуля csv, без него переводы строк внутри полей в кавычках разбираются неправильно, а при записи на платформах с окончанием строк \r\n добавляется лишний \r.
Со словарями: csv.DictReader
Обращаться к полю по номеру неудобно: добавят столбец, и код поедет. DictReader берёт первую строку файла как имена полей и отдаёт каждую запись словарём:
import csv
total = 0
with open("orders.csv", newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
total += float(row["amount"])
print(row["client"], "—", row["city"])
print("Итого:", total)
Анна — Казань
ООО "Ромашка" — Москва
Игорь — Нижний Новгород, Сормово
Итого: 64490.5
Файл из русского Excel
Выгрузка из Excel или 1С часто приходит с точкой с запятой, запятой в дробях и в кодировке Windows-1251. Все три вещи указываем явно:
import csv
with open("orders_excel.csv", newline="", encoding="cp1251") as f:
for row in csv.DictReader(f, delimiter=";"):
amount = float(row["amount"].replace(",", "."))
print(row["client"], amount)
Анна 12500.5
ООО "Ромашка" 48000.0
Игорь 3990.0
Не знаете разделитель заранее — его можно угадать классом csv.Sniffer. На нашем файле csv.Sniffer().sniff(f.read(2048), delimiters=";,\t").delimiter вернул ';'. Это эвристика: на коротких или странных файлах она промахивается, поэтому для регулярных выгрузок надёжнее прописать разделитель руками.
Как записать CSV в Python

Запись устроена зеркально: csv.writer принимает списки, csv.DictWriter — словари. Чтобы файл без настройки открылся двойным щелчком в русском Excel, нужны точка с запятой и кодировка utf-8-sig, то есть UTF-8 с меткой BOM:
import csv
orders = [
{"id": 1, "client": "Анна", "amount": "12500,50"},
{"id": 2, "client": 'ООО "Ромашка"', "amount": "48000"},
]
with open("report.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=["id", "client", "amount"], delimiter=";")
writer.writeheader()
writer.writerows(orders)
Что получилось в файле:
id;client;amount
1;Анна;12500,50
2;"ООО ""Ромашка""";48000
Кавычки вокруг названия компании модуль поставил и удвоил сам. Метку BOM в текстовом редакторе не видно, а в справке Microsoft прямо сказано, что CSV в UTF-8 с такой меткой открывается обычным образом. Без BOM русский Excel может прочитать файл как Windows-1251, и вместо «Анна» вы увидите «РђРЅРЅР°».
Дописать строки в конец готового файла можно тем же кодом с режимом "a" вместо "w". Тогда заголовок второй раз не пишите, иначе он окажется посреди данных.
CSV в pandas: read_csv и to_csv
Когда данных много или их нужно считать и группировать, удобнее библиотека pandas. Её ставят командой pip install pandas, лучше внутри виртуального окружения, а работать с ней проще всего в Jupyter Notebook. Примеры проверены на pandas 3.0.6.
import pandas as pd
df = pd.read_csv("orders_excel.csv", sep=";", decimal=",", encoding="cp1251")
print(df.dtypes)
print(df["amount"].sum())
id int64
client str
city str
amount float64
date str
dtype: object
64490.5
Параметр decimal="," сразу превратил «12500,50» в число, без ручной замены запятой. Основные параметры функции из документации pandas, которые пригодятся чаще других:
| Параметр | Что делает |
|---|---|
sep |
разделитель, по умолчанию запятая; sep=None включает тот же Sniffer |
decimal |
символ дробной части, для русских выгрузок "," |
encoding |
кодировка, по умолчанию utf-8 |
dtype |
типы столбцов, например {"sku": str} |
usecols |
читать только нужные столбцы, это быстрее и экономит память |
nrows, chunksize |
прочитать начало файла или идти по нему кусками |
Большой файл, который не помещается в память, читают кусками. Каждый кусок — обычная таблица:
import pandas as pd
total = 0
for chunk in pd.read_csv("orders.csv", chunksize=2):
total += chunk["amount"].sum()
print(total)
64490.5
Сохранить таблицу под русский Excel — одна строка: df.to_csv("orders_for_excel.csv", sep=";", decimal=",", index=False, encoding="utf-8-sig"). Без index=False pandas допишет в файл безымянный первый столбец с номерами строк.
Частые ошибки и что с ними делать

Вместо русских букв значки
Файл сохранён в одной кодировке, а открыт в другой. Python в таком случае падает сразу:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 30: invalid start byte
Решение: попробовать encoding="cp1251", а если файл из современного сервиса, то "utf-8-sig". В Excel — импорт через «Данные» с выбором кодировки в поле «Источник файла».
Вся таблица в одном столбце
Разделитель в файле не совпал с тем, что ждёт программа. Чаще всего это точка с запятой в файле и запятая в настройках, или наоборот. Решение — импорт с явным разделителем, как на кадрах выше, или delimiter=";" в коде.
Пропали нули в начале
Артикул «00125» превращается в 125, а длинный номер — в запись вида 1,23E+15. По справке Microsoft, Excel делает это автоматически и хранит не больше 15 значащих цифр. В Excel для Microsoft 365 и Excel 2024 автоматические преобразования можно отключить в параметрах, в более старых версиях — задать столбцу тип «Текст» при импорте через Power Query.
В pandas поведение то же самое, лечится параметром dtype:
import pandas as pd
print(pd.read_csv("goods.csv")["sku"].tolist())
print(pd.read_csv("goods.csv", dtype={"sku": str})["sku"].tolist())
[125, 380]
['00125', '00380']
Пустая строка после каждой записи
Файл, записанный в Windows без newline="", получает лишний \r в конце строк, и в Excel между записями появляются пустые строки. Решение одно: открывать файл с newline="" и при чтении, и при записи.
Даты стали числами или перепутались день и месяц
Excel и pandas по-разному понимают «02.10.2026»: где-то это 2 октября, где-то 10 февраля. Безопаснее хранить даты в CSV в виде 2026-10-02, а в pandas при необходимости указывать dayfirst=True.
Где освоить Python для работы с данными
CSV — первая точка встречи с данными почти в любой профессии: выгрузка из CRM, отчёт из рекламного кабинета, датасет для обучения модели. Прочитать один файл можно по этой инструкции. Чтобы собирать отчёты из десятка выгрузок и делать из них выводы, нужен системный Python и pandas, а это обычно путь аналитика данных или разработчика. С чего начать, расписано в плане как стать Python-разработчиком, а ниже — курсы по Python из нашего каталога.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 011 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




