удалить 4 байта после поиска, чтобы указать c расположение в двоичном файле - python - PullRequest
0 голосов
/ 29 апреля 2020

Я читаю шестнадцатеричный двоичный файл. Мне нужно удалить байты после команды поиска, чтобы указать c местоположение. Ниже код читает бинарный файл. Но я не знаю, как удалить 4 байта в середине файла.

 import os
 import struct

 with open("esears36_short.dat", "rb") as f:
    data = f.read(2)
    number = struct.unpack(">h", data)[0]
    f.seek(number, 1)
    #need to code to remove 4 bytes

Мне нужно выполнить этот код в l oop до EOF. Удалить 4 байта после каждого n байтов, указанных в поле number.

Значение поля number в этом случае: 28045

Пожалуйста, помогите!

1 Ответ

1 голос
/ 29 апреля 2020

Чтобы удалить 4 байта, вам нужно скопировать оставшийся файл вперед на 4 байта, что может быть грязно, поскольку вы читаете и записываете буферы в одном и том же файле. Проще написать новый файл и переименовать. В этом случае вы просто ищете вперед 4 байта по мере необходимости.

import os
import struct

with open("esears36_short.dat", "rb") as f, open("esars32_short.dat.tmp", 'wb') as f_out:
    data = f.read(2)
    number = struct.unpack(">h", data)[0]
    f.seek(2, 1)
    while True:
        buf = f.read(number)
        if not buf:
            break
        f_out.write(buf)
        f.seek(4, 1) # 4 bytes forward
os.remove("esears36_short.dat")
os.rename("esars32_short.dat.tmp", "esears36_short.dat")

Несмотря на то, что вы пишете новый файл, вы делаете меньше фактического копирования.

...