Формат CSV: чтение и запись

Формат CSV: чтение и запись

CSV (Comma-Separated Values) — один из самых распространённых форматов для хранения табличных данных. Экспорт из Excel, базы данных, логи — всё это часто хранится в CSV. Python предоставляет встроенный модуль csv для удобной работы с ним.

Что такое CSV

CSV — текстовый формат, где строки таблицы — это строки файла, а значения разделены запятыми (или другим символом):

имя,возраст,город
Алиса,25,Москва
Борис,30,Питер
Вера,28,Казань

Первая строка — обычно заголовки. Если значение содержит запятую или кавычки, оно берётся в двойные кавычки: "Иванов, Пётр".

Чтение CSV: csv.reader

csv.reader разбирает каждую строку на список значений:

import csv

with open("people.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['имя', 'возраст', 'город']
# ['Алиса', '25', 'Москва']
# ...

Параметр newline="" важен при работе с csv на Windows — он предотвращает двойные переводы строк.

Пропустить заголовок и обрабатывать данные:

import csv

with open("people.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)
    headers = next(reader)   # пропустить первую строку
    for row in reader:
        name, age, city = row
        print(f"{name} ({age} лет) — {city}")

Чтение в словари: csv.DictReader

DictReader автоматически использует первую строку как ключи и возвращает каждую строку как словарь:

import csv

with open("people.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['имя']}: {row['город']}")

Это удобнее, чем reader, потому что вам не важен порядок столбцов — обращаетесь по имени.

Запись CSV: csv.writer

import csv

data = [
    ["имя", "оценка", "статус"],
    ["Алиса", 92, "отлично"],
    ["Борис", 55, "удовлетворительно"],
    ["Вера",  78, "хорошо"],
]

with open("grades.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)   # записать все строки сразу

Или построчно через writer.writerow(row).

Запись словарей: csv.DictWriter

import csv

students = [
    {"имя": "Алиса", "оценка": 92},
    {"имя": "Борис", "оценка": 55},
]
fieldnames = ["имя", "оценка"]

with open("out.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()      # записать строку заголовков
    writer.writerows(students)

Другие разделители

CSV — не обязательно запятая. csv поддерживает любой разделитель:

import csv

# Чтение TSV (tab-separated values):
with open("data.tsv", "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f, delimiter="\t")
    for row in reader:
        print(row)

Проверь себя

Зачем нужен newline="" при открытии CSV-файла?

На Windows стандартный перевод строки — \r\n. Без newline="" Python добавляет ещё один перевод строки к \r\n, и в CSV появляются пустые строки. newline="" отключает автоматическую обработку переводов строк, предоставляя это модулю csv.

Итог

  • csv.reader(f) — итератор по строкам (каждая строка — список строк).
  • csv.DictReader(f) — каждая строка как словарь (ключи из заголовка).
  • csv.writer(f).writerow(row) / writerows(data) — запись.
  • csv.DictWriter(f, fieldnames).writeheader() + writerows(dicts) — запись словарей.
  • Всегда указывайте newline="" и encoding="utf-8".

В следующем уроке познакомимся с форматом JSON — популярным способом хранения структурированных данных.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике