Большинство файловых систем не работают так.Содержимое файла сопоставляется с блоками данных, и эти блоки данных не обязательно будут смежными в базовой системе (т.е. не обязательно «бок о бок»).
Когда вы ищете, вы ищетев байтовое смещение.Поэтому, если вы хотите вставить новые данные между 2-байтовыми смещениями определенного блока, вам придется фактически сдвинуть все последующие данные на длину того, что вы вставляете.Поскольку блок может быть полностью «заполнен», сдвиг байтов может потребовать выделения нового блока.Если последующий блок также был полностью «заполнен», вам придется также перенести данные этого блока и т. Д. Вы можете начать понимать, почему не существует «простой» операции для смещения данных.
Как правило, мы решаем эту проблему, просто считывая все данные в память, а затем перезаписывая их обратно в файл.Когда вы сталкиваетесь со смещением байтов, в которое вы заинтересованы вставить «новый» контент, вы записываете свой буфер и затем продолжаете записывать «оригинальные» данные.В Python вам не придется беспокоиться о чередовании нескольких буферов при записи, поскольку Python будет абстрагировать данные в некоторую структуру данных.Таким образом, вы просто объединяете структуры данных более высокого уровня (например, если это текстовый файл, просто объединяете 3 строки).
Если файл слишком велик, чтобы вы могли удобно разместить его в памяти, вы можетезаписать в «новый» временный файл, а затем просто заменить его оригиналом после завершения операции записи.
Теперь, если вы рассмотрите «смещение» данных в блоках данных, о которых я упоминал выше, выМожно рассмотреть более простой крайний случай, когда вы вставляете данные длины N со смещением, кратным N, где N - фиксированный размер блока данных в файловой системе.В этом случае, если вы думаете о блоках данных как о связном списке, вы можете считать довольно простой операцией добавить новый блок данных между смещением, в которое вы вставляете, и следующим блоком в списке.
Фактически, системы Linux поддерживают выделение дополнительного блока на этой границе.См fallocate
.