Python: атомарно заменить файл через os.replace

Категория: Python · Язык: Python · Обновлено:

Чтобы не оставить обрезанный файл при падении во время записи, сначала сохраните данные во временный файл рядом с целевым, затем замените его через os.replace. На одном filesystem замена атомарна.

Рабочий пример

Python
import os
from pathlib import Path
target138 = Path("/tmp/settings-demo.json")
temporary138 = target138.with_suffix(".json.tmp")
temporary138.write_text('{"enabled": true}\n', encoding="utf-8")
os.replace(temporary138, target138)
print(target138.read_text(encoding="utf-8"))  # {"enabled": true}

Временный путь расположен рядом с целевым, чтобы rename не пересекал filesystem. Для более строгой устойчивости к потере питания дополнительно flush и fsync файла и каталога.

Частый вопрос

Можно ли заменить файл из другой папки?

Можно, если обе папки на одном filesystem. Между файловыми системами os.replace может завершиться ошибкой; создавайте временный файл в каталоге назначения.