レッスンのプレビュー

Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию

Чтение и запись файлов, with, pathlib, json и csv. Для опытных: UTF-8 по умолчанию в 3.15 (PEP 686), сжатие zstd (3.14), поддержка frozendict в json.

файл pathlib json csv кодировка
このレッスンで学ぶこと
  • Читать и писать текстовые файлы
  • Работать с путями через 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チューター、面接が利用できます。

ログインまたは新規登録 サブスクリプションに登録

レッスンの内容

  1. На Linux работало, на Windows — «Р•РґР°»
  2. open и with: файл открыт ровно столько, сколько нужно
  3. Грабли: режим "w" стирает файл сразу
  4. pathlib: пути как объекты, а не строки
  5. CSV: таблица трат в виде словарей
  6. JSON: сохранить отчёт и прочитать обратно
  7. ❓ Стоп-проверка: что будет с ключами-числами?
  8. 💡 Разбор: ключи превратятся в строки
  9. Что нового: UTF-8 по умолчанию (3.15, PEP 686)
  10. Грабли перехода: старые файлы в cp1251
  11. Что нового: zstd и копирование в pathlib (3.14)
  12. Итог: трекер читает CSV и пишет JSON

この講義に関する記事

このコースのすべてのレッスン

  1. Python 3.15 с нуля и для опытных: что нового и как учить
  2. Python 3.15: установка, REPL и первый скрипт за десять минут
  3. Переменные, числа и строки в Python: f-строки и t-строки
  4. Условия, циклы и match/case в Python: управляем ходом программы
  5. Списки, кортежи, словари и множества: frozendict в Python 3.15
  6. Comprehensions в Python: распаковка * и ** внутри (PEP 798)
  7. Функции и аннотации типов в Python: от def до sentinel
  8. Ошибки и исключения в Python 3.15: читаем трейсбек и подсказки «Did you mean»
  9. Модули, пакеты и ленивые импорты в Python 3.15 (PEP 810)
  10. Файлы, JSON и CSV в Python: pathlib и UTF-8 по умолчанию
  11. Классы и dataclasses в Python: ООП без лишнего кода
  12. Асинхронность и потоки в Python: asyncio, TaskGroup и free-threading
  13. Профилирование Python 3.15: Tachyon вместо cProfile и итоговый проект