Формат CSV: что это за файл, как его открыть и прочитать в Python

CSV — текстовый файл с таблицей, где значения разделены запятой или точкой с запятой.

Разбираем, как устроен формат, почему Excel открывает его одной колонкой или кракозябрами и как читать и записывать CSV в Python модулем csv и через pandas, с проверенными примерами кода.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2983 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3637 экспертных мнений Подписаться на Телеграм-канал
Обложка: Формат CSV: что это за файл, как его открыть и прочитать в Python

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

Ниже разберём, как устроен формат, почему русский Excel показывает CSV одной колонкой или кракозябрами и как читать и записывать такие файлы в Python, чтобы их потом без сюрпризов открыл любой табличный редактор. Если вы только выбираете, в чём хранить данные, сначала посмотрите разбор форматов Excel и статью о том, что такое JSON: это два соседних способа передать ту же таблицу.

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что такое CSV-файл и как он устроен

Рой открывает таблицу из 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

  1. Создайте пустую книгу и перейдите на вкладку «Данные».
  2. В группе «Получение и преобразование данных» нажмите «Из текстового/CSV-файла» и выберите файл.
  3. В окне предпросмотра проверьте три поля: «Источник файла» (кодировка, для современных выгрузок — UTF-8), «Разделитель» и способ определения типов данных.
  4. Нажмите «Загрузить», чтобы данные легли на новый лист, или «Преобразовать данные», чтобы сначала поправить их в 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 выгрузку с точкой с запятой. Каждая строка файла попадает в одну ячейку:

CSV-файл с точкой с запятой, вставленный в Google Таблицы: все значения строки в одной ячейке
Каждая строка файла легла в одну ячейку столбца A — так выглядит CSV, открытый с неверным разделителем

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

Меню «Данные» в Google Таблицах с пунктом «Разделить текст на столбцы»
Пункт «Разделить текст на столбцы» внизу меню «Данные», ячейки A1:A4 уже выделены

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

Автоопределение разделителя в Google Таблицах выбрало запятую и разрезало сумму 12500,50
Разделитель «Определять автоматически» выбрал запятую: сумма и название города развалились на две колонки

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

Список разделителей в Google Таблицах: запятая, точка с запятой, точка, пробел, настроить
В списке «Разделитель» выбираем «Точка с запятой»

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

Таблица заказов из CSV, правильно разделённая по точке с запятой в Google Таблицах
Пять столбцов, как в исходном файле; сумма 12500,50 осталась текстом из-за англоязычного региона таблицы

Другие способы

  • LibreOffice Calc при открытии CSV сразу показывает окно импорта с выбором кодировки и разделителя. Это самый спокойный бесплатный вариант для файлов в Windows-1251.
  • Блокнот, VS Code, любой текстовый редактор покажут файл как есть. Так быстрее всего понять, какой в нём разделитель и нет ли лишних кавычек.
  • Excel в браузере открывает CSV так же, как десктопная версия, если программы на компьютере нет. Как до него добраться, рассказано в статье об Excel онлайн.
  • Онлайн-просмотрщики годятся для разового взгляда, но загружать туда выгрузку с персональными данными клиентов не стоит.
Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как прочитать 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

Рой радуется, что скрипт на 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.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Где освоить Python для работы с данными

CSV — первая точка встречи с данными почти в любой профессии: выгрузка из CRM, отчёт из рекламного кабинета, датасет для обучения модели. Прочитать один файл можно по этой инструкции. Чтобы собирать отчёты из десятка выгрузок и делать из них выводы, нужен системный Python и pandas, а это обычно путь аналитика данных или разработчика. С чего начать, расписано в плане как стать Python-разработчиком, а ниже — курсы по Python из нашего каталога.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 011 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Что такое CSV-формат простыми словами?

Это текстовый файл, в котором хранится таблица: одна строка файла соответствует одной строке таблицы, а значения разделены запятой или точкой с запятой. Формул, оформления и нескольких листов в CSV нет, зато его понимают почти все программы и сервисы.

Чем открыть CSV-файл, если Excel не установлен?

Подойдут Google Таблицы («Файл» → «Импорт»), бесплатный LibreOffice Calc или любой текстовый редактор вроде Блокнота. В редакторе таблица выглядит как текст, зато сразу видно, какой в файле разделитель.

Почему CSV открывается в Excel одним столбцом?

Разделитель в файле не совпал с настройками Excel: например, в файле запятые, а русский Excel ждёт точку с запятой. Откройте файл через «Данные» → «Из текстового/CSV-файла» и выберите разделитель вручную.

Чем CSV отличается от XLSX?

XLSX хранит книгу целиком: листы, формулы, форматирование. CSV хранит только значения одного листа обычным текстом, поэтому весит меньше и легко читается кодом. Подробнее о форматах — в статье о форматах Excel.

Как прочитать CSV-файл в Python без pandas?

Через встроенный модуль csv: откройте файл с параметрами newline="" и нужной кодировкой и передайте его в csv.reader или csv.DictReader. Для файлов из русского Excel добавьте delimiter=";" и encoding="cp1251" или "utf-8-sig".

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!