Проблема в том, что файл (по сути) представляет собой массив байтов на диске (или любой другой физический субстрат, но, в любом случае, байтов!), И «строка» может занимать различное количество байтов; поэтому для вставки или удаления строк (если вы не всегда строго заменяете строку другой строкой одинаковой длины в байтах) потребуется «смещение» всего остального файла «вверх» или «вниз» на разницу в байтах ... которая может быть чрезвычайно обременительной операцией (так как остальная часть файла может быть гигабайтами, даже если вы просто меняете длину одной строки на 1 байт в начале файла).
Таким образом, такие операции могут быть невероятно обременительными и поэтому обычно никогда не предлагаются в качестве примитивов в ЛЮБОМ языке, поддерживающем файлы с переменной длиной строки (C, Python, Java, C ++, Ruby или ЛЮБОЙ другой такой язык). Крайне маловероятно, что вам действительно нужно платить такую потенциально несвязанную стоимость в плане производительности и риска (сбой системы или диска во время «смещения» ГБ или увеличения или уменьшения данных может разрушить работоспособность всего вашего огромного файла), когда Совершенно простая, адекватная, быстрая, безопасная и разумная техника, которую вы пытаетесь избежать, имеет в основном НУЛЕВЫЕ минусы (так что это далеко не очевидно, ПОЧЕМУ вы пытаетесь избежать этого?).
Используйте файл результата, отличный от исходного файла, когда закончите файл результата над исходным файлом (атомарная операция в большинстве систем, если вы находитесь в одной файловой системе), и у вас действительно есть лучший из всех возможных миров.