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