Если ваша программа внезапно завершает работу, буферизованный вывод может не попасть из вашей программы в операционную систему. Если питание отключено, буферизованный вывод может не попасть из операционной системы на диск.
Первый обрабатывается с помощью flush для файлового объекта, а второй с помощью fsync в модуле io.
f.flush()
os.fsync(f.fileno())
Это немного медленно, конечно. Вы также можете использовать open('file.txt', 'w', buffering=0)
для устранения буферизованного ввода-вывода и пропустить необходимость очистки (но вам все равно потребуется fsync).
(Несмотря на это, все еще нет никаких гарантий: известно, что жесткие диски сообщают о завершении записи, когда она фактически находится в энергозависимом хранилище на жестком диске.)
Как ваша программа восстанавливается после прерывания, это совсем другой вопрос. Возможно, он может прочитать выходной файл, чтобы определить, где он остановился. (При возобновлении записи не забывайте использовать режим добавления 'a'
, чтобы не обрезать выходной файл.)
Также попробуйте модуль sqlite3 : базовая база данных SQLite устойчива к сбоям питания.