Добавить данные в начало или середину больших файлов - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно добавить начало или середину двоичного файла, и этот файл может быть большим (от 100 МБ до 15 ГБ).Большинство ответов, которые я видел до сих пор, либо не содержат большие файлы, либо полностью переписывают файл полностью.Надеясь избежать метода «запись в новый файл и замена старого файла», если это вообще возможно.На мой взгляд, что-то вроде этого должно быть в состоянии добавить данные, например, из 60-го байта:

with open('file.dat', 'ab') as f:
    f.seek(60)
    f.write(b'_hello_world_')

Однако это не работает должным образом, скорее он добавляется в конец файла.Все еще пытаюсь понять, как не работает предыдущий пример, но использование io.BytesIO() работает таким же образом.Надеюсь, я просто пропускаю что-то простое.

1 Ответ

0 голосов
/ 19 октября 2018

Параметр filemode a означает явно для a ppend текст в конце строки, см. Документацию :

и 'a'для добавления (что в некоторых системах Unix означает, что все записи добавляются в конец файла независимо от текущей позиции поиска)

Таким образом, поиск не помогает, если вы используете a в качестве файлового режимапараметр.Но вам не нужно использовать a.Вместо этого просто используйте r+, это означает, что файл также можно открыть с возможностью его обновления (чтение и запись):

with open('file.dat', 'r+b') as f:
    f.seek(60)
    f.write(b"_hello_world_")    

Я все еще не уверен, так ли это и с Windows (в документации сказано " в некоторых системах Unix ").

...