Вы видите эффект буферизации.
Вы можете уменьшить эффект, подключившись к вызову flush :
f.write(str_to_oc)
f.flush()
CTRL / C прибывает асинхронно,так что это не исправит это полностью.Кроме того, если вы решите вставить / удалить, чтобы отдельные записи и общий размер файла изменились, вы будете недовольны тем, как старые + новые записи смещены.
За кулисами иногда io.BufferedWriter
запрос необработанной записи , которая превращается в уровень ОС syscall .Вы говорите, что CTRL / C или трассировка фатального стека приводит к преждевременному завершению программы.В этом случае весь процесс интерпретатора Python завершается, вызывая неявное close()
, что может привести к комбинации старых + новых байтов, считываемых из вашего файла.Обратите внимание, что многобайтовая кодовая точка UTF8 может охватывать дисковые блоки, что может привести к несчастью.
Учитывая наблюдаемую надежность вашей программы, звучит так, что вам будет хорошо оставить исходную нетронутой до успешного завершения обработки:
tmp_path = file_path + '.tmp'
with open(file_path) as fin:
with open(tmp_path, 'w') as fout:
for line in fin:
# (do stuff, compute output)
fout.write(out_line + '\n')
os.rename(tmp_path, file_path) # atomic operation, all-or-nothing