Глава 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
Режимы открытия — обзор
Четыре базовых режима
open(путь, "r")
Чтение.
Ошибка, если файл не существует.
open(путь, "w")
Запись.
Создаёт новый файл или очищает существующий
УЖЕ ПРИ ОТКРЫТИИ.
open(путь, "a")
Дозапись в конец.
Создаёт файл, если его нет.
open(путь, "x")
Создаёт новый файл.
FileExistsError, если файл уже существует.
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, без установки