Kodokon kodokon.com

Файлы и модули: with, import, организация кода

Читай и записывай файлы аккуратно через with, обменивайся данными в JSON и организуй код в импортируемые модули.

10 мин · 3 вопросов

Открыть этот урок в Kodokon

Чтение и запись файлов - хлеб насущный настоящей программы: экспорт, логи, конфигурации. Ключевое слово with открывает файл и гарантирует его закрытие, даже если посреди блока произойдёт ошибка. Это единственный профессиональный способ открыть файл: без него забытый close() может испортить данные или исчерпать системные ресурсы.

PYTHON
lines = ["alpha", "beta", "gamma"]

with open("notes.txt", "w", encoding="utf-8") as f:
    for line in lines:
        f.write(line + "\n")

with open("notes.txt", encoding="utf-8") as f:
    content = f.read()

print(content)
Режим 'w' пишет, перезаписывая содержимое; без указания режима ты читаешь.

Для структурированных данных не выдумывай свой формат: модуль json из стандартной библиотеки превращает словари и списки в текст и обратно. Это универсальный формат обмена между программами, API и файлами конфигурации.

PYTHON
import json

config = {"debug": True, "retries": 3}

with open("config.json", "w", encoding="utf-8") as f:
    json.dump(config, f, indent=2)

with open("config.json", encoding="utf-8") as f:
    loaded = json.load(f)

print(loaded["retries"])  # 3
json.dump записывает структуру, json.load восстанавливает её.

Модуль - это просто файл .py: import billing загружает billing.py и выполняет его содержимое только один раз. Организуй код по зонам ответственности - один модуль для выставления счетов, другой для хранения данных - и держи инструкции import в начале файла. Проверка if __name__ == "__main__" различает две ситуации: при прямом запуске файл выполняет этот блок; при импорте - игнорирует его.

PYTHON
def compute_total(prices):
    return round(sum(prices), 2)

def main():
    print(compute_total([9.99, 4.5, 20.0]))

if __name__ == "__main__":
    main()
Содержимое billing.py: импортируется куда угодно, запускается напрямую.
BASH
python billing.py
Запущенный так, файл выполняет main(); при импорте он не делает ничего.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. В чём главное преимущество with open(...) перед просто open()?
    • Файл закрывается автоматически, даже в случае ошибки
    • Чтение файла происходит быстрее
    • Файл создаётся, если его нет, при любом режиме
  2. В чём разница между режимами "w" и "a"?
    • "w" перезаписывает существующее содержимое, "a" дописывает в конец
    • "w" пишет текст, "a" пишет двоичные данные
    • "w" создаёт файл, "a" падает, если файла нет
  3. Для чего нужна проверка if __name__ == "__main__"?
    • Чтобы убедиться, что файл действительно называется main.py
    • Чтобы выполнить блок только тогда, когда файл запущен напрямую
    • Чтобы запретить другим файлам импортировать модуль