CSV (Comma-Separated Values) — текстовый формат для хранения табличных данных. Его используют для обмена информацией между программами, выгрузки отчетов, обработки результатов запросов к базам данных и подготовки датасетов для машинного обучения.
В Python есть встроенный модуль csv, поэтому для базовой работы с такими файлами не нужно устанавливать дополнительные библиотеки. С его помощью можно читать строки, получать данные в виде списков и словарей, создавать новые документы и сохранять изменения.
Для простых задач достаточно стандартного csv. Если предстоит анализировать большие таблицы, фильтровать записи, рассчитывать статистику или объединять наборы данных, может пригодиться pandas.
Что такое CSV и как устроен файл
CSV хранит таблицу в виде текстовых записей. Обычно каждая строка соответствует одной записи, а значения отдельных полей разделены запятыми.
Например, файл users.csv:
name,age,city
Анна,28,Москва
Иван,34,Казань
Ольга,25,ТулаВ первой строке указаны заголовки столбцов, остальные строки содержат данные.
У CSV нет единственного обязательного стандарта, который одинаково соблюдают все приложения. Встречаются разные разделители, правила экранирования и кодировки. В русскоязычных таблицах вместо запятых иногда используют точку с запятой:
name;age;city
Анна;28;Москва
Иван;34;Казань
Это стоит учитывать при чтении файла в Python.
У CSV есть несколько особенностей:
- значения хранятся в текстовом виде;
- типы данных не задаются схемой: числа, даты и логические значения нужно интерпретировать отдельно;
- первая строка может содержать заголовки, но это не обязательное требование;
- поля могут включать запятые, кавычки и переносы строк, если они корректно оформлены;
- формат не предназначен для хранения сложных вложенных структур.
CSV удобен для обмена данными с Excel, базами данных, аналитическими инструментами и веб-сервисами. Однако он не сохраняет формулы, оформление ячеек и структуру листов, как это делает XLSX.
Как открыть CSV-файл в Python
Для работы с CSV импортируют встроенный модуль:
import csvЗатем открывают файл стандартной функцией open().
import csv
with open("users.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.reader(file)
for row in reader:
print(row)В результате каждая строка будет представлена списком:
['name', 'age', 'city']
['Анна', '28', 'Москва']
['Иван', '34', 'Казань']
['Ольга', '25', 'Тула']
Разберем параметры:
- r — режим чтения;
- encoding=»utf-8″ — кодировка файла;
- newline=»» — рекомендуемый режим для корректной обработки переносов строк модулем csv;
- csv.reader() — создает объект для чтения записей.
Конструкция with автоматически закрывает файл после завершения работы, в том числе при возникновении исключения.
Если документ сохранен в другой кодировке, например Windows-1251, нужно указать подходящее значение encoding. Иначе при чтении русских букв может возникнуть UnicodeDecodeError или появятся некорректные символы.
Как читать CSV через csv.reader
Метод reader подходит, когда структура таблицы известна и удобнее обращаться к значениям по индексам.
Допустим, требуется получить имена пользователей и их возраст, пропустив заголовок.
import csv
with open("users.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.reader(file)
next(reader, None)
for row in reader:
name = row[0]
age = int(row[1])
print(f"{name}: {age}")Здесь next(reader, None) пропускает первую запись. Второй аргумент позволяет избежать ошибки, если файл пустой.
csv.reader() возвращает значения как строки. Если нужно выполнять математические операции, сравнивать даты или проверять логические условия, преобразование типов придется делать самостоятельно.

Например, int(row[1]) преобразует возраст в целое число. Если в столбце окажется пустая ячейка или текст вместо числа, программа получит ValueError.
Курс «Python Ninja» в Академии IT DMS
Сертификат, диплом о переподготовке или удостоверение о повышении квалификации.
AFFTIMES−5 % на первую покупку. Скидка суммируется с любыми акциями школы. Если оплачиваете через менеджера в чате, назовите ему промокод.
Как прочитать CSV с разделителем точка с запятой
Если файл использует ;, его нужно передать в параметре delimiter.
import csv
with open("users.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.reader(file, delimiter=";")
for row in reader:
print(row)По умолчанию csv.reader() использует запятую. Если указать неправильный разделитель, Python может прочитать всю строку как одно поле.
Не стоит заменять запятые или точки с запятой через split(): такой подход ломается, когда разделитель встречается внутри значения в кавычках.
Например:
name,comment
Анна,"Работает с Python, SQL и API"Корректный парсер определит здесь два столбца, а не четыре.
Как читать CSV через csv.DictReader
Если столбцы имеют названия, удобнее использовать csv.DictReader. Он позволяет обращаться к полям по имени, а не по позиции в списке.
import csv
with open("users.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.DictReader(file)
for row in reader:
print(row["name"], row["city"])Каждая запись возвращается в виде словаря:
{
'name': 'Анна',
'age': '28',
'city': 'Москва'
}
DictReader автоматически использует первую строку как заголовок. Если заголовков нет, их можно задать самостоятельно:
reader = csv.DictReader(
file,
fieldnames=["name", "age", "city"]
)
В этом случае первая строка файла тоже будет считаться данными, если ее отдельно не пропустить.
У DictReader есть несколько полезных опций:
- fieldnames — список имен столбцов;
- если в строке меньше полей, недостающие значения заполняются пустой строкой;
- лишние значения попадают в список, доступный по ключу None.
Как создать CSV-файл в Python
Для записи используют csv.writer(). Он преобразует последовательности значений в CSV-записи и самостоятельно обрабатывает кавычки и разделители.
import csv
users = [
["name", "age", "city"],
["Анна", 28, "Москва"],
["Иван", 34, "Казань"],
["Ольга", 25, "Тула"]
]
with open("users_new.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
writer.writerows(users)

После выполнения скрипта в текущей рабочей директории появится users_new.csv.
Основные методы записи:
- writer.writerow(row) — записать одну строку;
- writer.writerows(rows) — записать несколько строк.
Режим w создает файл или перезаписывает существующий. Если требуется сохранить предыдущие записи и добавить новые, используют режим a.
with open("users_new.csv", "a", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
writer.writerow(["Петр", 31, "Самара"])
При добавлении строк важно соблюдать существующий порядок столбцов. Иначе данные окажутся не в тех полях.
Как записать данные через csv.DictWriter
DictWriter подходит для формирования таблиц из словарей. Он удобен, когда данные получены из API, базы данных или другого источника в виде объектов с именованными полями.
import csv
users = [
{"name": "Анна", "age": 28, "city": "Москва"},
{"name": "Иван", "age": 34, "city": "Казань"}
]
columns = ["name", "age", "city"]
with open("users.csv", "w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=columns)
writer.writeheader()
writer.writerows(users)
Метод writeheader() добавляет строку с названиями столбцов.
Если в словаре отсутствует какое-то поле, по умолчанию вместо него записывается пустая строка. Значения по умолчанию можно изменить через restval.
Параметр extrasaction=»raise» используется по умолчанию: если в словаре встретятся ключи, которых нет в fieldnames, возникнет ValueError. При необходимости можно задать extrasaction=»ignore», чтобы не записывать лишние поля.
Как обработать CSV с помощью pandas
Для аналитики и обработки таблиц часто выбирают библиотеку pandas. Она загружает CSV в структуру DataFrame, в которой доступны операции над столбцами, фильтрация, группировка и сортировка.
Установить библиотеку можно командой:
pip install pandasПрочитать файл:
import pandas as pd
df = pd.read_csv("users.csv", encoding="utf-8")
print(df.head())
print(df.info())head() показывает первые строки, info() выводит информацию о столбцах, типах и пропущенных значениях.
Пример фильтрации:
adults = df[df["age"] >= 18]
adults.to_csv("adults.csv", index=False, encoding="utf-8")
Параметр index=False не позволяет записать служебный индекс DataFrame в отдельный столбец.
Полезные возможности pandas.read_csv():
| Параметр | Для чего нужен |
| sep | Задает разделитель |
| encoding | Указывает кодировку |
| usecols | Позволяет загрузить отдельные столбцы |
| dtype | Фиксирует типы данных |
| nrows | Ограничивает число читаемых записей |
| chunksize | Загружает данные частями |
| parse_dates | Позволяет преобразовать выбранные столбцы в даты |
Например, если нужно загрузить только два столбца:
df = pd.read_csv(
"users.csv",
usecols=["name", "age"],
dtype={"name": str, "age": "Int64"}
)
Здесь Int64 — nullable-тип pandas, который допускает пропущенные значения.
У pandas есть важная особенность: библиотека может автоматически распознавать пустые значения и преобразовывать типы. Это удобно при аналитике, но не всегда подходит для точного переноса исходных данных. Например, идентификатор 00125 может потерять ведущие нули при автоматическом определении числового типа.
Если значения нужно сохранить как текст, тип столбца лучше задать явно.
Для больших файлов предусмотрен chunksize:
for chunk in pd.read_csv("large.csv", chunksize=100_000):
print(chunk.shape)
Как обработать большой CSV-файл без pandas
Если задача заключается в последовательном чтении и простой обработке строк, достаточно стандартного csv.
import csv
total = 0
with open("large.csv", "r", encoding="utf-8", newline="") as file:
reader = csv.DictReader(file)
for row in reader:
total += int(row["amount"])
print(total)
reader и DictReader позволяют перебирать записи последовательно. В памяти не требуется хранить весь файл.

Так можно:
- считать сумму или количество записей;
- отбирать строки по условию;
- искать некорректные значения;
- переносить подходящие записи в другой файл.
Если нужно сохранить результат фильтрации, можно сразу записывать подходящие строки через csv.writer или csv.DictWriter.
Типичные ошибки при чтении и записи CSV
При работе с CSV чаще всего возникают проблемы с форматом исходного документа.
1. Ошибка FileNotFoundError.
Python ищет файл относительно текущей рабочей директории, которая может отличаться от папки со скриптом. Для диагностики можно проверить Path.cwd() из модуля pathlib или указать полный путь.
2. Некорректная кодировка.
Если файл сохранен в Windows-1251, попробуйте открыть его с encoding=»cp1251″. Кодировку лучше выяснить у источника.
3. Неверный разделитель.
Если строка возвращается одним элементом списка, проверьте delimiter. Для автоматического определения можно использовать csv.Sniffer, но его результат не гарантирован. На неоднозначных данных надежнее явно указать формат.
4. Ошибки при преобразовании типов.
Пустые поля, пробелы и некорректные значения могут приводить к ValueError. Проверяйте входные данные до вычислений.
5. Пропуск или смещение столбцов.
Причиной могут быть неверные заголовки, разное количество полей или неправильная интерпретация кавычек. Для важных выгрузок стоит проверять схему и число полей каждой записи.
6. Пустые строки при записи.
Открывайте файл с newline=»». Это рекомендуемый вариант для модуля csv, который сам управляет обработкой переводов строк.
Что выбрать: csv или pandas
Выбор зависит от задачи.
- csv.reader — если нужно читать записи по порядку и работать с индексами.
- csv.DictReader — если удобнее получать значения по именам столбцов.
- csv.writer — для создания и последовательной записи CSV.
- csv.DictWriter — для формирования выгрузок из словарей.
- pandas — для аналитики, фильтрации, группировки и преобразования табличных данных.
Обычный модуль Python часто предпочтительнее для небольших утилит, потоковой обработки и простого обмена информацией. pandas удобнее для исследовательских задач и расчетов над таблицами.
Заключение
CSV-файлы в Python можно читать, создавать и обрабатывать без сторонних зависимостей. Для этого достаточно освоить csv.reader, csv.writer, csv.DictReader и csv.DictWriter.
Главное при работе с такими документами — правильно определить разделитель, кодировку, наличие заголовков и типы значений. Для больших выгрузок полезно обрабатывать записи последовательно или использовать чтение частями в pandas.
При обмене данными с другими системами также стоит проверять структуру строк, пропущенные значения и безопасность содержимого. Это помогает избежать ошибок при импорте, экспорте и дальнейшей обработке таблиц.
FAQ
Можно сравнить число полей в каждой записи с ожидаемой схемой. При использовании csv.reader достаточно проверить len(row). Для DictReader также стоит учитывать лишние поля, которые попадают в ключ None, и отсутствующие значения.
Если файлы имеют одинаковую структуру, можно последовательно читать их через csv.reader и записывать строки в общий документ с помощью csv.writer.
Для небольших файлов можно использовать множество set, чтобы отслеживать уже встреченные записи.
Для небольших таблиц можно загрузить записи в список, преобразовать значения нужного столбца и применить sorted(). Если сортировка выполняется по числовому полю, предварительно преобразуйте его в число, иначе строки "100" и "20" будут сравниваться лексикографически.
Сначала стоит проверить кодировку, которую поддерживает целевая версия Excel. Для совместимости часто используют UTF-8 с BOM, например при записи через encoding="utf-8-sig".





