Глава 15 · Python и файлы

Пишем в файлы: write() и режимы r/w/a/x

Каждый режим открытия — это осознанный выбор, а не деталь синтаксиса.

write() не добавляет перевод строки сам

write_bez_n.py
with open("log.txt", "w", encoding="utf-8") as f:
    f.write("Hello")
    f.write("World")
Записали
f.write("Hello")
f.write("World")
На диске
HelloWorld
write() не вставляет \n сам — если нужен перевод строки, пишите его явно: f.write("Hello\n").

Режимы открытия — обзор

Четыре базовых режима
open(путь, "r")
Чтение.
Ошибка, если файл не существует.
open(путь, "w")
Запись.
Создаёт новый файл или очищает существующий
УЖЕ ПРИ ОТКРЫТИИ.
open(путь, "a")
Дозапись в конец.
Создаёт файл, если его нет.
open(путь, "x")
Создаёт новый файл.
FileExistsError, если файл уже существует.
Дальше добавляются модификаторы t/b/+ (раздел 15.17 и далее).
Debug Lab 5: "w" стирает файл ещё до записи
perezapis.py
# rezultaty.txt уже содержит важные результаты предыдущей игры
with open("rezultaty.txt", "w", encoding="utf-8") as f:
    pass   # ничего даже не записали
(файл rezultaty.txt теперь пуст)
Что видно на экране

Файл стал пустым, хотя мы ничего и не записали внутри блока. Открытие в режиме "w" стирает прежнее содержимое в момент открытия, а не в момент первого write().

Исправленный код
dozapis_vmesto_w.py
# если цель — добавить, а не заменить, нужен режим "a", а не "w"
with open("rezultaty.txt", "a", encoding="utf-8") as f:
    f.write("Новый результат\n")

Режим "x" — создать, но не заменить

rezhim_x.py
try:
    with open("save.json", "x", encoding="utf-8") as f:
        f.write("{}")
except FileExistsError:
    print("Файл сохранения уже существует — не перезаписываем его случайно")
x — защита от случайной перезаписи
Если важно не перезаписать существующий файл по ошибке — режим "x" явно сообщит об этом через FileExistsError, вместо тихой перезаписи, которую сделал бы режим "w".
Debug Lab 6: writelines() не добавляет переносы строк
writelines_lovushka.py
stroki = ["Anna", "Bob", "Carlos"]
with open("igroki.txt", "w", encoding="utf-8") as f:
    f.writelines(stroki)
(файл igroki.txt содержит одну строку: AnnaBobCarlos)
Что видно на экране

Ожидались три строки, а получилась одна слитая строка. writelines() — несмотря на название — не добавляет переносы строк сама, она просто записывает элементы один за другим. Если нужны отдельные строки, перевод строки нужно включить в каждый элемент заранее.

Исправленный код
writelines_fixed.py
stroki = ["Anna", "Bob", "Carlos"]
with open("igroki.txt", "w", encoding="utf-8") as f:
    f.writelines(s + "\n" for s in stroki)

Чуть глубже: модификаторы +

r+, w+, a+ открывают файл сразу для чтения и записи — но базовая семантика усечения/дозаписи каждого режима (w стирает, a добавляет в конец) продолжает действовать и здесь. Это необязательный материал — базовых r/w/a/x достаточно для большинства программ.

Практика: write() и режимы r/w/a/x
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →