атомарная запись в файл с Python

Я использую Python для записи блоков текста в файлы в единственной операции:

open(file, 'w').write(text)

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

50
задан hoju 25 February 2010 в 02:21
поделиться

1 ответ

Запишите данные во временный файл и, когда данные будут успешно записаны, переименуйте файл в правильный файл назначения, например

f = open(tmpFile, 'w')
f.write(text)
# make sure that all data is on disk
# see http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
f.flush()
os.fsync(f.fileno()) 
f.close()

os.rename(tmpFile, myFile)

Согласно документу http://docs.python.org/library/os.html#os.rename

В случае успеха переименование будет атомарной операцией (это требование POSIX). требование POSIX). В Windows, если dst уже существует, будет вызван OSError даже если это файл; возможно, не существует способа реализовать атомарное переименование, когда dst называет существующий файл

также

Операция может завершиться неудачей в некоторых вариантах Unix, если src и dst находятся в разных файловых системах.

Примечание:

  • Это может быть не атомарная операция, если src и dest находятся не в одной файловой системе

  • os. Шаг fsync может быть пропущен, если производительность/реактивность важнее целостности данных в таких случаях, как отключение питания, крах системы и т.д.

89
ответ дан 7 November 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: