Đoạn xem trước bài giảng

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

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

файл pathlib json csv кодировка
Bạn sẽ học gì trong bài giảng này
  • Читать и писать текстовые файлы
  • Работать с путями через pathlib
  • Сохранять данные в JSON и CSV

Phần đầu bài giảng

На 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'

Bài giảng đầy đủ dành cho thuê bao

Còn 9 slide nữa trong phiên bản đầy đủ.

Video, toàn bộ slide, ghi chú, bài kiểm tra, gia sư AI và phỏng vấn sẽ mở sau khi đăng nhập và đăng ký thuê bao.

Đăng nhập hoặc đăng ký Đăng ký thuê bao

Nội dung bài giảng

  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

Bài viết liên quan đến bài học này

Tất cả bài giảng của khóa học

  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 и итоговый проект