Глава 15 · Python и файлы

CSV: таблицы в текстовом виде

Табличные данные заслуживают формат, который понимает, что такое поле — а не просто разделитель.

Таблица в текстовом виде

rekordy.csv
name,score,level
Anna,1200,5
Bob,900,4

CSV (comma-separated values) — простой текстовый формат для таблиц: строки — записи, значения в строке разделены запятыми. Подходит для экспорта в таблицы, отчётов, наборов данных.

Почему НЕ split(",")

Debug Lab 13: CSV, разобранный через split(",")
csv_split_lovushka.py
stroka = 'Anna,"Отлично, продолжай!"'
chasti = stroka.split(",")
print(chasti)
['Anna', '"Отлично', ' продолжай!"']
Что видно на экране

Поле в кавычках само содержало запятую — как и полноценно допускает формат CSV. split(",") ничего не знает про кавычки в CSV и слепо режет по каждой запятой, разрывая одно поле на два. Разбирать CSV нужно модулем csv, который правильно обрабатывает кавычки и запятые внутри полей.

Исправленный код
csv_modul_pravilno.py
import csv
import io

stroka = 'Anna,"Отлично, продолжай!"'
reader = csv.reader(io.StringIO(stroka))
print(next(reader))   # ['Anna', 'Отлично, продолжай!']

csv.reader и csv.DictReader

csv_reader.py
import csv

with open("rekordy.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
Зачем newline=""
Документация модуля csv рекомендует открывать файл с newline="", чтобы сам модуль полностью управлял переносами строк внутри полей — без этого возможна двойная обработка переносов на некоторых платформах.
csv_dictreader.py
import csv

with open("rekordy.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], int(row["score"]))
Значения CSV — всегда строки, пока вы их не преобразуете
row["score"] — это строка "1200", а не число 1200, даже если оно похоже на число визуально. CSV не хранит информацию о типе — приведение (int(...), float(...)) нужно делать самостоятельно.

Запись CSV

csv_writer.py
import csv

rows = [
    {"name": "Anna", "score": 1200},
    {"name": "Bob", "score": 900},
]

with open("novye_rekordy.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "score"])
    writer.writeheader()
    writer.writerows(rows)

CSV vs JSON — и CSV — не Excel

CSVJSON
Лучше подходит дляоднородных таблиц (строки/столбцы)вложенных структур
Типы данныхвсё — строки текстастроки, числа, булевы, вложенность
CSV — это не файл Excel
.csv — обычный текстовый формат, а не формат-книга .xlsx с листами, формулами и форматированием — тем занимаются другие, специализированные библиотеки.
Практика: CSV — csv.reader, DictReader, writer
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →