Python·100 вопросов

Как сделать атомарную запись файла?

Ответ

Атомарная запись файла на языке Python представляет собой важный технический прием, который позволяет избежать появления поврежденных или наполовину записанных файлов в случае сбоя программы, отключения питания или нехватки дискового пространства в процессе сохранения данных. Основная идея метода заключается в том, что все изменения записываются сначала в изолированный временный файл, а затем мгновенно переносятся на целевое место с помощью операции переименования, которая на большинстве современных файловых систем выполняется атомарно.

Для реализации этого процесса рекомендуется использовать стандартные модули pathlib и os, которые обеспечивают кроссплатформенную совместимость и удобную работу с путями файловой системы. Создавать временный файл следует в том же самом каталоге, где находится конечный файл, так как это гарантирует нахождение обоих объектов на одном физическом разделе диска, что является обязательным условием для атомарности операции переименования.

Процесс безопасной записи состоит из нескольких последовательных шагов.

Создайте временный файл в целевой директории, используя, например, модуль tempfile или просто уникальное имя рядом с целевым файлом.
Запишите все необходимые данные, сериализуйте JSON или выполните любые другие операции ввода-вывода в этот временный файл.
Вызовите метод fsync для дескриптора файла, если критически важно гарантировать физическую запись данных на диск, а не только в буфер операционной системы.
Закройте временный файл и примените функцию os.replace, которая атомарно заменит старый файл новым на уровне операционной системы.

Использование такого подхода гарантирует, что даже если приложение аварийно завершит работу прямо посреди записи, пользователь или программа никогда не прочитают полупустой файл, поскольку старая рабочая версия останется в целости до момента успешного завершения операции замены.

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем