Запись в файл на Python: с чего начать новичку
Разбираем, как записать текст в файл на Python 3.x: контекстный менеджер, режимы открытия, кодировка. К концу вы сохраните данные в файл и не потеряете их из-за забытого close().

К концу этого гайда у вас будет рабочий скрипт, который создаёт текстовый файл и записывает в него строки. Займёт минут пятнадцать, если Python уже установлен. Всё, что понадобится, — интерпретатор и любой текстовый редактор.
Что нужно иметь до начала
- Python 3.6 или новее. Проверьте командой
python --versionв терминале. Всё в статье работает на Python 3.6+; примеры проверены на 3.12. - Права на запись в папку, где вы запускаете скрипт. Если запускаете из своей домашней директории — права уже есть.
- Любой редактор: VS Code, PyCharm, даже Блокнот. Файл со скриптом сохраняйте с расширением
.py.
Отдельно: чтение из файла — это соседняя тема, здесь только запись.
Первая запись: пять строк, которые работают
Самый короткий рабочий вариант выглядит так:
with open('notes.txt', 'w', encoding='utf-8') as file:
file.write('Привет из Python\n')
file.write('Вторая строка\n')
Запустите скрипт. Рядом с ним появится файл notes.txt с двумя строками. Откройте его — увидите ровно то, что записали.
Разберём по частям, что тут произошло.
1. open() открывает файл
Функция open() принимает имя файла и режим. Здесь режим 'w' — write, «запись». Если файла нет, Python его создаст. Если файл есть — его содержимое сотрётся полностью. Это первая ловушка новичка: запустили скрипт дважды, старые данные исчезли.
Проверка: после запуска в папке появился файл с указанным именем.
2. with закрывает файл за вас
Конструкция with ... as file — контекстный менеджер1. Когда блок внутри with завершается, файл автоматически закрывается, даже если внутри возникла ошибка. Без этого пришлось бы вручную вызывать file.close() и не забыть про случай с исключением.
Правило для новичка простое: открываете файл — делаете это через with. Тогда вы физически не сможете забыть закрыть файл.
3. write() пишет строку
Метод write() принимает строку и записывает её как есть. Он не добавляет перенос строки сам — если нужен переход на новую строку, ставьте \n вручную. Забыли \n — весь текст склеится в одну длинную строку.
Проверка: откройте файл, строки должны идти каждая с новой строки.
4. encoding='utf-8' спасает русский текст
Без явного encoding='utf-8' Python берёт кодировку по умолчанию из настроек системы. На Windows это часто cp1251, и тогда русский текст в файле может открыться «кракозябрами» в другой программе. Указывайте кодировку всегда — это одна из самых частых причин испорченного текста.
Режимы открытия: w, a и другие
Второй аргумент open() решает, что произойдёт с файлом. Вот основные режимы для записи:
| Режим | Что делает | Если файл есть | Если файла нет |
|---|---|---|---|
'w' | Запись | Стирает содержимое | Создаёт файл |
'a' | Дозапись в конец | Добавляет к концу | Создаёт файл |
'x' | Создание | Ошибка FileExistsError | Создаёт файл |
'r' | Только чтение | Читает | Ошибка FileNotFoundError |
Если вы ведёте лог и хотите добавлять строки, а не затирать старые, — используйте 'a':
with open('log.txt', 'a', encoding='utf-8') as file:
file.write('Новое событие\n')
Каждый запуск дописывает строку в конец, старое сохраняется. Проверка: запустите скрипт трижды — в файле три строки.
Записать список строк сразу
Если у вас есть список строк, не обязательно вызывать write() в цикле. Есть метод writelines() — но у него та же особенность: переносы он сам не добавляет.
строки = ['первая', 'вторая', 'третья']
with open('items.txt', 'w', encoding='utf-8') as file:
for строка in строки:
file.write(строка + '\n')
Цикл с ручным + '\n' — самый предсказуемый способ. Именно из-за забытых переносов новички чаще спотыкаются на writelines(), поэтому для начала держитесь цикла.
Если не получилось
Типичные ошибки, которые вы реально увидите в терминале:
PermissionError: [Errno 13] Permission denied— нет прав на запись в эту папку или файл открыт в другой программе. Запустите скрипт из своей домашней папки или закройте файл в редакторе.FileNotFoundError: [Errno 2] No such file or directory— вы указали путь к несуществующей папке, например'data/notes.txt', а папкиdataнет. Python создаёт файлы, но не папки. Создайте папку заранее.TypeError: write() argument must be str, not int— вы передали вwrite()число. Оберните значение вstr():file.write(str(42)).- Текст склеился в одну строку — забыли
\nв конце каждой строки. Добавьте перенос. - Русский текст превратился в «кракозябры» — не указали
encoding='utf-8'при записи или открываете файл в программе с другой кодировкой.
Что делать дальше
Когда запись освоена, следующий логичный шаг — научиться читать из файла (режим 'r' и методы read(), readlines()). Дальше стоит посмотреть на структурированные форматы: модуль json для сохранения словарей и списков, модуль csv для таблиц. Для работы с путями к файлам вместо склеивания строк через + изучите pathlib из стандартной библиотеки — он избавляет от проблем с разными разделителями путей на Windows и Linux.
Официальное описание open() и всех режимов — в документации Python, ссылка ниже.
Транскрибатор встреч: Запись созвона или диктофона — в текст с разделением по спикерам, протоколом и списком задач.
Спросить за 25 ₽Источники: Python docs — Built-in Functions: open(), Python docs — Reading and Writing Files (tutorial)
Частые вопросы
А если я запустил скрипт с режимом 'w' и потерял старые данные?
У меня Python 3.5 или старее, всё сработает?
Нужно ли всегда указывать encoding, если у меня только английский текст?
Чем write() отличается от print() с параметром file?
Файл создаётся, но я не могу его найти. Где он?
Можно ли писать в файл без with?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.