CSV в Python: чтение, запись и обработка таблиц через модуль csv
Поисковый запрос «CSV в Python» чаще всего возникает, когда нужно быстро прочитать таблицу, обработать данные и сохранить результат без установки тяжёлых библиотек. Для этого в Python есть встроенный модуль csv: он умеет корректно работать с запятыми внутри значений, кавычками, разными разделителями и переносами строк.
Что такое CSV и когда он нужен
CSV — это текстовый формат для хранения таблиц. Каждая строка файла — строка таблицы, а значения разделяются специальным символом, чаще всего запятой или точкой с запятой.
Пример файла sales.csv:
date,product,qty,price
2026-01-10,Keyboard,2,3500
2026-01-11,Mouse,5,1200
2026-01-12,Monitor,1,18000
CSV часто используют для обмена данными между Excel, Google Sheets, базами данных, CRM и Python-скриптами.
Почему не стоит использовать split(',')
Новички часто читают CSV как обычный текст и делают split(','). Это работает только на самых простых данных. Проблема появляется, если внутри значения есть запятая:
2026-01-10,"Keyboard, wireless",2,3500
Метод split(',') разобьёт название товара неправильно. Модуль csv учитывает кавычки и другие правила формата, поэтому его и нужно использовать.
Чтение CSV-файла в Python
Базовый пример чтения файла:
import csv
with open('sales.csv', 'r', encoding='utf-8', newline='') as file:
reader = csv.reader(file)
for row in reader:
print(row)
На выходе каждая строка будет списком:
['date', 'product', 'qty', 'price']
['2026-01-10', 'Keyboard', '2', '3500']
Обратите внимание на параметры:
- encoding='utf-8' — помогает избежать проблем с кириллицей;
- newline='' — рекомендуется документацией Python для корректной работы модуля csv;
- with open(...) — автоматически закрывает файл после работы.
Как пропустить заголовок таблицы
Если первая строка содержит названия колонок, её часто нужно пропустить:
import csv
with open('sales.csv', 'r', encoding='utf-8', newline='') as file:
reader = csv.reader(file)
header = next(reader)
print('Колонки:', header)
for row in reader:
date = row[0]
product = row[1]
qty = int(row[2])
price = int(row[3])
print(product, qty * price)
Важно: данные из CSV приходят как строки. Если нужно считать сумму, количество или цену, преобразуйте значения через int() или float().
DictReader: чтение CSV как словарей
Работать с индексами row[0], row[1] не всегда удобно. Если в файле есть заголовки, лучше использовать csv.DictReader:
import csv
total = 0
with open('sales.csv', 'r', encoding='utf-8', newline='') as file:
reader = csv.DictReader(file)
for row in reader:
qty = int(row['qty'])
price = int(row['price'])
total += qty * price
print('Общая сумма продаж:', total)
Преимущество этого подхода — код становится понятнее. Даже если порядок колонок изменится, обращение по имени поля продолжит работать, если названия колонок останутся прежними.
Запись CSV-файла
Чтобы создать CSV-файл, используйте csv.writer:
import csv
rows = [
['date', 'product', 'qty', 'price'],
['2026-01-10', 'Keyboard', 2, 3500],
['2026-01-11', 'Mouse', 5, 1200],
]
with open('new_sales.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(rows)
Метод writerow() записывает одну строку, а writerows() — сразу несколько строк.
DictWriter: запись словарей в CSV
Если данные в программе представлены словарями, удобнее использовать csv.DictWriter:
import csv
products = [
{'name': 'Keyboard', 'qty': 2, 'price': 3500},
{'name': 'Mouse', 'qty': 5, 'price': 1200},
]
with open('products.csv', 'w', encoding='utf-8', newline='') as file:
fieldnames = ['name', 'qty', 'price']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(products)
writeheader() записывает строку с названиями колонок. Без неё файл будет содержать только данные.
Практический пример: фильтрация CSV
Допустим, нужно выбрать из файла только продажи дороже 5000 рублей и сохранить их отдельно:
import csv
with open('sales.csv', 'r', encoding='utf-8', newline='') as input_file, \
open('big_sales.csv', 'w', encoding='utf-8', newline='') as output_file:
reader = csv.DictReader(input_file)
writer = csv.DictWriter(output_file, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
amount = int(row['qty']) * int(row['price'])
if amount > 5000:
writer.writerow(row)
Такой скрипт уже похож на реальную задачу автоматизации: прочитать выгрузку, отфильтровать данные и сформировать новый файл.
CSV с точкой с запятой
В русскоязычной версии Excel CSV-файлы часто сохраняются с разделителем ;. В таком случае укажите параметр delimiter:
import csv
with open('excel_export.csv', 'r', encoding='utf-8', newline='') as file:
reader = csv.DictReader(file, delimiter=';')
for row in reader:
print(row)
При записи это работает так же:
with open('report.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow(['name', 'email'])
writer.writerow(['Анна', 'anna@example.com'])
Частые ошибки при работе с CSV в Python
- Забыли newline='' — в Windows могут появиться пустые строки между записями.
- Не указали encoding — возможны ошибки с русскими буквами.
- Считаете числа строками — перед вычислениями используйте int() или float().
- Используете split(',') — ломается на кавычках, запятых внутри текста и сложных CSV.
- Путаете разделитель — для Excel-файлов часто нужен delimiter=';'.
Когда нужен pandas, а когда достаточно csv
Модуль csv отлично подходит для простых задач: прочитать файл, пройтись циклом, отфильтровать строки, сохранить результат. Если же нужны группировки, сводные таблицы, сложная аналитика и работа с большими датасетами, стоит изучить библиотеку pandas.
Если вы хотите уверенно освоить не только CSV, но и функции, коллекции, файлы, ООП, автоматизацию и реальные проекты, посмотрите курс «Python с нуля до уверенного разработчика» — он хорошо подойдёт тем, кто хочет выстроить знания системно, а не собирать их из разрозненных примеров.
Итог
Работа с CSV в Python начинается с модуля csv. Используйте csv.reader для простого чтения, DictReader для удобной работы по названиям колонок, writer и DictWriter для записи файлов. Главное — не забывайте про encoding, newline='' и правильный delimiter. Эти базовые приёмы закрывают множество повседневных задач автоматизации.
-
Создано 24.08.2026 17:00:37
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.