Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
Чтение и запись файлов, with, pathlib, json и csv. Для опытных: UTF-8 по умолчанию в 3.15 (PEP 686), сжатие zstd (3.14), поддержка frozendict в json.
- Читать и писать текстовые файлы
- Работать с путями через pathlib
- Сохранять данные в JSON и CSV
จุดเริ่มต้นของบทเรียน
На Linux работало, на Windows — «Р•РґР°»
- До 3.15: open() без encoding брал кодировку системы
- Windows с русской локалью: cp1251, Linux и macOS: UTF-8
- 3.15: UTF-8 везде (PEP 686)
История, которую пережил почти каждый, кто писал на Python под Windows. Скрипт трекера отлично читает таблицу трат на вашем ноутбуке с линуксом. Коллега запускает его на Windows — и вместо слова «Еда» видит набор кракозябр, или вообще ошибку декодирования. Причина в одной незаметной детали: файл открывался без указания кодировки, и Python брал системную, а она на Windows другая. В 3.15 это наконец исправили. Разберёмся, как работать с файлами правильно.
open и with: файл открыт ровно столько, сколько нужно
- Режимы: "r" чтение, "w" перезапись, "a" дописать, "b" байты
- with закроет файл даже при ошибке
- Файл: data/expenses.csv
Файл открывается встроенной функцией open: передаём путь и режим — читать, перезаписать или дописать в конец. А вот закрыть его потом легко забыть, особенно если по дороге случится ошибка. Поэтому файлы почти всегда открывают через with. Это как дверь с доводчиком: зашли, сделали дело, и при выходе из блока дверь закроется сама, даже если вы выбежали в панике из-за исключения. Внутри блока файл можно читать построчно обычным циклом.
with open("data/expenses.csv", encoding="utf-8") as f:
header = f.readline() # первая строка
for line in f: # остальные по одной
print(line.rstrip())
# здесь файл уже закрыт
with open("data/log.txt", "a", encoding="utf-8") as log:
log.write("отчёт собран\n") # дописали в конец
Грабли: режим "w" стирает файл сразу
- ❌ Часто делают: open(path, "w"), чтобы «дописать»
- ✅ "w" обнуляет файл в момент открытия
- ✅ Дописать — "a"; не перезаписать чужое — "x"
Ловушка, на которой теряли данные очень многие. Хотели добавить новую трату в конец файла, открыли его в режиме «w» — и вся история за год исчезла. Режим записи обнуляет файл в ту же секунду, когда вы его открыли, ещё до того, как вы что-то записали. Для добавления в конец нужен режим «a». А если хотите гарантию, что не затрёте существующий файл, есть режим «x»: он упадёт с ошибкой, если файл уже есть.
>>> open("expenses.csv", "w") # файл уже пуст!
>>> open("expenses.csv", "a") # дописываем в конец
>>> open("report.json", "x")
FileExistsError: [Errno 17] File exists: 'report.json'
บทเรียนฉบับเต็มใช้ได้เมื่อสมัครสมาชิก
ฉบับเต็มมีสไลด์เพิ่มอีก 9 สไลด์
วิดีโอ สไลด์ทั้งหมด โน้ต แบบทดสอบ AI ติวเตอร์ และการสัมภาษณ์จะเปิดหลังเข้าสู่ระบบและสมัครสมาชิก
เข้าสู่ระบบหรือลงทะเบียน สมัครสมาชิกเนื้อหาบทเรียน
- На Linux работало, на Windows — «Р•РґР°»
- open и with: файл открыт ровно столько, сколько нужно
- Грабли: режим "w" стирает файл сразу
- pathlib: пути как объекты, а не строки
- CSV: таблица трат в виде словарей
- JSON: сохранить отчёт и прочитать обратно
- ❓ Стоп-проверка: что будет с ключами-числами?
- 💡 Разбор: ключи превратятся в строки
- Что нового: UTF-8 по умолчанию (3.15, PEP 686)
- Грабли перехода: старые файлы в cp1251
- Что нового: zstd и копирование в pathlib (3.14)
- Итог: трекер читает CSV и пишет JSON
บทเรียนทั้งหมดในคอร์สนี้
- Python 3.15 с нуля и для опытных: что нового и как учить
- Python 3.15: установка, REPL и первый скрипт за десять минут
- Переменные, числа и строки в Python: f-строки и t-строки
- Условия, циклы и match/case в Python: управляем ходом программы
- Списки, кортежи, словари и множества: frozendict в Python 3.15
- Comprehensions в Python: распаковка * и ** внутри (PEP 798)
- Функции и аннотации типов в Python: от def до sentinel
- Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
- Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
- Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
- Классы и dataclasses в Python: ООП без лишнего кода
- Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
- Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект