Привет! Ты уже умеешь читать и записывать обычные текстовые файлы. Но часто данные хранятся в формате CSV — таблицы, где значения разделены запятыми. Python имеет встроенный модуль csv, который делает работу с таким форматом простой и удобной.
В этой статье мы разберём:
- Что такое CSV и зачем он нужен
- Чтение CSV как списков (reader)
- Чтение CSV как словарей (DictReader)
- Запись CSV как списков (writer)
- Запись CSV как словарей (DictWriter)
- Настройка разделителей и кавычек
- Что нужно знать перед началом
- Основная часть
- Что такое CSV?
- Чтение CSV как списков (csv.reader)
- Чтение CSV как словарей (csv.DictReader)
- Запись CSV как списков (csv.writer)
- Запись CSV как словарей (csv.DictWriter)
- Настройка разделителей и кавычек
- Другой разделитель (delimiter)
- Работа с кавычками (quoting)
- Режимы цитирования:
- Чтение больших CSV-файлов
- Практический пример: анализ продаж
- Работа с CSV в Pandas vs csv
- Задачи для закрепления
- Нюансы и подводные камни
- Параметр newline=»
- Кодировки
- Кавычки и запятые в данных
- Частые ошибки и как их избежать
- Ошибка 1: Лишние пустые строки в CSV
- Ошибка 2: Неправильная кодировка
- Ошибка 3: Забыл writeheader()
- Шпаргалка
- Заключение
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python (модуль csv встроенный — ничего не нужно устанавливать!)
- Базовое понимание списков и словарей
- Желание работать с табличными данными
Совет: CSV — самый популярный формат для обмена данными между разными программами (Excel, Google Sheets, базы данных).
Основная часть
Что такое CSV?
CSV (Comma-Separated Values) — это текстовый формат для хранения табличных данных. Каждая строка файла — это одна запись, а столбцы разделены запятыми (или другими символами).
Пример CSV-файла users.csv:
Имя,Возраст,Город
Анна,25,Москва
Иван,30,СПб
Мария,22,КазаньСовет: В русской версии Excel часто используется разделитель
;вместо,. Мы разберём, как работать с разными разделителями.
Чтение CSV как списков (csv.reader)
csv.reader читает файл построчно и возвращает списки значений:
import csv
with open('users.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)Результат:
['Имя', 'Возраст', 'Город']
['Анна', '25', 'Москва']
['Иван', '30', 'СПб']
['Мария', '22', 'Казань']Пропускаем заголовок:
with open('users.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)
header = next(reader) # Пропускаем первую строку
print(f"Заголовки: {header}")
for row in reader:
print(row)Совет:
next(reader)пропускает первую строку. Это удобно, когда в файле есть заголовки.
Чтение CSV как словарей (csv.DictReader)
csv.DictReader — более удобный способ. Он использует первую строку как названия ключей и возвращает словари:
import csv
with open('users.csv', 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row)Результат:
{'Имя': 'Анна', 'Возраст': '25', 'Город': 'Москва'}
{'Имя': 'Иван', 'Возраст': '30', 'Город': 'СПб'}
{'Имя': 'Мария', 'Возраст': '22', 'Город': 'Казань'}Доступ к данным по ключам:
with open('users.csv', 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(f"{row['Имя']} живёт в {row['Город']}")Совет: DictReader делает код более читаемым. Не нужно запоминать индексы колонок!
Запись CSV как списков (csv.writer)
import csv
data = [
['Имя', 'Возраст', 'Город'],
['Анна', 25, 'Москва'],
['Иван', 30, 'СПб'],
['Мария', 22, 'Казань']
]
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data) # Записываем все строкиЗапись построчно:
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Имя', 'Возраст', 'Город'])
writer.writerow(['Анна', 25, 'Москва'])
writer.writerow(['Иван', 30, 'СПб'])Совет: Параметр
newline=''важен для правильной работы на Windows (иначе добавляются лишние пустые строки).
Запись CSV как словарей (csv.DictWriter)
import csv
data = [
{'Имя': 'Анна', 'Возраст': 25, 'Город': 'Москва'},
{'Имя': 'Иван', 'Возраст': 30, 'Город': 'СПб'},
{'Имя': 'Мария', 'Возраст': 22, 'Город': 'Казань'}
]
fieldnames = ['Имя', 'Возраст', 'Город']
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # Записываем заголовки
writer.writerows(data) # Записываем все строкиСовет:
writeheader()записывает заголовки изfieldnames. Убедись, что порядок полей совпадает с тем, что ты ожидаешь.
Настройка разделителей и кавычек
Другой разделитель (delimiter)
# Файл с разделителем ;
with open('data.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file, delimiter=';')
for row in reader:
print(row)Работа с кавычками (quoting)
import csv
data = [
['Имя', 'Описание'],
['Анна', 'Любит "Python" и программирование'],
['Иван', 'Работает в IT-компании']
]
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file, quoting=csv.QUOTE_ALL) # Все поля в кавычках
writer.writerows(data)Результат:
"Имя","Описание"
"Анна","Любит ""Python"" и программирование"
"Иван","Работает в IT-компании"Совет:
quoting=csv.QUOTE_ALLпомещает все поля в кавычки. Это полезно, если в данных есть запятые или кавычки.
Режимы цитирования:
| Режим | Описание |
|---|---|
csv.QUOTE_ALL | Все поля в кавычках |
csv.QUOTE_MINIMAL | Только поля, содержащие разделители или кавычки |
csv.QUOTE_NONNUMERIC | Все нечисловые поля в кавычках |
csv.QUOTE_NONE | Без кавычек (нужен escape-символ) |
Чтение больших CSV-файлов
Для больших файлов не стоит загружать всё в память. Используй построчное чтение:
import csv
def process_large_csv(filename):
with open(filename, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
# Обрабатываем строку по одной
process_row(row)Совет: Этот подход позволяет обрабатывать файлы любого размера, не перегружая память.
Практический пример: анализ продаж
import csv
# Читаем данные о продажах
sales = []
with open('sales.csv', 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
row['Продажи'] = int(row['Продажи'])
row['Цена'] = int(row['Цена'])
row['Выручка'] = row['Продажи'] * row['Цена']
sales.append(row)
# Считаем общую выручку
total_revenue = sum(row['Выручка'] for row in sales)
print(f"Общая выручка: {total_revenue}")
# Сохраняем отчёт в новый CSV
with open('report.csv', 'w', encoding='utf-8', newline='') as file:
fieldnames = ['Товар', 'Продажи', 'Цена', 'Выручка']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(sales)Работа с CSV в Pandas vs csv
| Функция | csv (встроенный) | Pandas |
|---|---|---|
| Установка | Встроен | Нужно устанавливать |
| Скорость | Средняя | Высокая |
| Простота | Средняя | Простая |
| Размер данных | Любой | Зависит от памяти |
| Функциональность | Базовая | Расширенная |
Совет: Для простых задач используй csv (не нужны дополнительные библиотеки). Для сложного анализа данных — Pandas.
Задачи для закрепления
Задача 1. Прочитай CSV-файл data.csv с разделителем , и выведи все строки.
Задача 2. Прочитай CSV-файл с помощью DictReader и выведи значения колонки Имя.
Задача 3. Запиши список строк [['a', 1], ['b', 2], ['c', 3]] в CSV-файл.
Задача 4. Запиши список словарей в CSV с заголовками.
Задача 5. Прочитай CSV-файл с разделителем ; и кодировкой cp1251.
Ответы:
Задача 1.
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)Задача 2.
with open('data.csv', 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row['Имя'])Задача 3.
data = [['a', 1], ['b', 2], ['c', 3]]
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(data)Задача 4.
data = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(file, fieldnames=['a', 'b'])
writer.writeheader()
writer.writerows(data)Задача 5.
with open('data.csv', 'r', encoding='cp1251') as file:
reader = csv.reader(file, delimiter=';')
for row in reader:
print(row)Нюансы и подводные камни
Параметр newline=»
Для корректной записи CSV на Windows всегда используй newline='':
with open('file.csv', 'w', newline='') as file:
writer = csv.writer(file)Кодировки
Для русского текста всегда указывай encoding='utf-8'. Если файл открывается с кракозябрами — попробуй encoding='cp1251'.
Кавычки и запятые в данных
Если данные содержат запятые, используй quoting=csv.QUOTE_ALL или QUOTE_MINIMAL.
Частые ошибки и как их избежать
Ошибка 1: Лишние пустые строки в CSV
# Плохо (на Windows будут пустые строки)
with open('file.csv', 'w') as file:
writer = csv.writer(file)
# Хорошо
with open('file.csv', 'w', newline='') as file:
writer = csv.writer(file)Ошибка 2: Неправильная кодировка
# UnicodeDecodeError ошибка
with open('file.csv', 'r') as file:
reader = csv.reader(file)
# Укажи кодировку
with open('file.csv', 'r', encoding='utf-8') as file:
reader = csv.reader(file)Ошибка 3: Забыл writeheader()
# Заголовки не записаны
writer = csv.DictWriter(file, fieldnames=['a', 'b'])
writer.writerows(data)
# Записываем заголовки
writer = csv.DictWriter(file, fieldnames=['a', 'b'])
writer.writeheader()
writer.writerows(data)Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Чтение как списки | csv.reader(file) |
| Чтение как словари | csv.DictReader(file) |
| Запись списков | csv.writer(file) |
| Запись словарей | csv.DictWriter(file, fieldnames) |
| Другой разделитель | delimiter=';' |
| Кавычки для всех полей | quoting=csv.QUOTE_ALL |
| Пропустить заголовок | next(reader) |
| Сохранить в файл | writer.writerows(data) |
Заключение
Сегодня мы узнали:
- Что такое CSV и как он устроен
- Чтение CSV с помощью
csv.reader(списки) иcsv.DictReader(словари) - Запись CSV через
csv.writerиcsv.DictWriter - Настройка разделителей и кавычек
- Как работать с большими CSV-файлами








