В режиме записи «добавление» в файл Python записываются только новые байты или же перезаписывается и весь файл?

Nov 29 2020

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

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

Ответы

2 Vlad Nov 30 2020 at 03:31

Файловые операции Python - это удобные оболочки над файловыми операциями в операционной системе. Операционная система либо реализует операции этой файловой системы внутри себя, перенаправляя их в загружаемый модуль (плагин) или внешний сервер (NFS, SMB). Большинство операционных систем с самого 1971 года способны выполнять добавление данных в существующий файл. По крайней мере, те, которые утверждают, что даже удаленно совместимы с POSIX.

Режим добавления POSIX просто открывает файл для записи и перемещает указатель файла в конец файла. Это означает, что все операции записи будут записываться только после конца файла.

Из этого может быть несколько исключений, например, некоторая процедура может использовать системные вызовы низкого уровня для перемещения указателя файла назад. Или базовая файловая система может быть несовместима с POSIX и использовать какую-либо форму объектного транзакционного хранилища, например AWS S3. Но для любого стандартного сценария я бы не стал беспокоиться о таких случаях.

Однако, поскольку вы упомянули резервное копирование как вариант использования, вам нужно быть особенно осторожным. Резервное копирование не так просто, как кажется на первый взгляд. О чем стоит беспокоиться: различные кеши, которые могут хранить данные в памяти до того, как они будут записаны на диск. Что будет, если питание отключится сразу после того, как вы добавили новые записи. Кроме того, что произойдет, если кто-то запустит несколько копий вашей программы?

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