Работа с CSV: модуль csv (чтение и запись)

Работа с CSV: модуль csv (чтение и запись) Работа с файлами

Привет! Ты уже умеешь читать и записывать обычные текстовые файлы. Но часто данные хранятся в формате CSV — таблицы, где значения разделены запятыми. Python имеет встроенный модуль csv, который делает работу с таким форматом простой и удобной.

В этой статье мы разберём:

  • Что такое CSV и зачем он нужен
  • Чтение CSV как списков (reader)
  • Чтение CSV как словарей (DictReader)
  • Запись CSV как списков (writer)
  • Запись CSV как словарей (DictWriter)
  • Настройка разделителей и кавычек

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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-файлами

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×