Как определить текущую позицию в файле при чтении шестнадцатеричного файла (.dat) в python?

Я делаю проект, в котором я должен прочитать .dat file и извлечь из него нужные значения. Мне нужно автоматизировать весь процесс, то есть одним щелчком мыши я хочу получить все необходимые значения из этого файла .dat. Процесс поиска для него немного сложен.

Прямо сейчас все, что я хочу, это каким-то образом создать функцию, с помощью которой я могу получить текущую позицию, до которой я прочитал количество байтов. Например: если функция вызова, через которую я читаю первые 8 байтов из файла .dat, то мне нужна функция, которая сообщит мне текущую позицию (т.е. как счетчик, который проверяет общее количество байтов, которые я прочитал ).

Если я вызываю три функции, в которых первая функция читает 8 байтов, вторая функция 4 байта и третья функция снова 8 байтов, то мне нужен какой-то метод, с помощью которого я смогу получить текущую позицию, в этом случае 8+4+8= 20.

Надеюсь, вы понимаете мою озабоченность.

routeHead_len=8
def readDAT(filename):
    with open(filename,'rb') as f:
        global data
        data=f.read()
    return data

def readRouteHead():                            
    route_Head=[]
    for i in range(routeHead_len):
        route_Head.append(data[i])
    return route_Head


person Akshat Pant    schedule 30.08.2019    source источник
comment
искать и рассказывать должно быть достаточно. просто вызовите его для открытого файлового объекта   -  person bigdataolddriver    schedule 30.08.2019
comment
@bigdataolddriver, но, сэр, я хочу, чтобы текущая позиция соответствовала байтам, которые я прочитал ..   -  person Akshat Pant    schedule 30.08.2019


Ответы (1)


хитрый способ — обойти это с помощью bytesio
и извлечь выгоду из семейства функций io

import io
allData = open("/bin/bash",'rb').read()
fp = io.BytesIO(allData)
print("before {}, length {} after {}".format(fp.tell(), len(fp.read(8)),fp.tell()))
print("before {}, length {} after {}".format(fp.tell(), len(fp.read(4)),fp.tell()))
print("before {}, length {} after {}".format(fp.tell(), len(fp.read(8)),fp.tell()))

output:
before 0, length 8 after 8
before 8, length 4 after 12
before 12, length 8 after 20

person bigdataolddriver    schedule 30.08.2019
comment
да, сэр, это будет очень сложно ... я вызвал функцию readDAT (которая будет читать полный файл и сохранять его в буфере с именем «данные»), после чего я извлекаю значения из данных, используя циклы for ... но согласно вашему методу я не смогу этого сделать.. мне нужно прочитать файл dat в сегментах.. означает, что я должен прочитать сначала 8 байтов, затем 4 байта, затем n * 4 байта (здесь n является динамическим) и так далее.. так что будет лучший способ сделать это.. - person Akshat Pant; 02.09.2019