Посмотрите на модуль struct
в стандартной библиотеке. Он предоставляет функцию с именем unpack
.
struct.unpack(format, buffer)
Распаковка из буфера буфера (предположительно упакованного pack(format, ...)
) в соответствии с форматом строки формата. Результатом является кортеж, даже если он содержит ровно один элемент. Размер буфера в байтах должен соответствовать размеру, требуемому форматом, что отражено в calcsize()
.
Важным моментом является порядок байтов вашего файла. В моем посте я предполагаю, что у вашего файла всегда есть порядковый номер.
Character | Byte order | Size | Alignment
@ native native native
= native standard none
< little standard none
> big standard none
В этой таблице указано название нужного вам формата. Вот оно <
. Вы можете посмотреть коды формата для типов по https://docs.python.org/3/library/struct.html#format -характерам . Первая структура, заголовок файла состоит сначала из 16-битного целого числа без знака, затем 6 байтов данных, 16-битного целого числа без знака и затем байта без знака. Таким образом, код формата для заголовка файла '<H6sBHB'
. Таким образом, чтение заголовка файла может выглядеть так:
from struct import unpack
header = f.read(11)
file_number, date, file_id, file_count = unpack('<H6sHB', header)
С помощью struct.iter_unpack
теперь вы можете анализировать все заголовки подфайлов.
subfile_headers = f.read(7 * file_count) # One subfile header takes 7 bytes
subfile_iterator = struct.iter_unpack('<HBHH', subfile_headers)
for start, length, data, end in subfile_iterator:
... # do something with the subfile headers
Надеюсь, это было немного полезно, хотя Я не до конца понял ваш вопрос. Было бы полезно, если бы вы могли предоставить некоторую информацию о том, что вы хотите сделать с этим файлом. Также я, вероятно, мог бы помочь вам больше, если бы вы объяснили мне эту часть вашего вопроса:
Также, если я запишу эту логику c в другом файле, передав файл в качестве входного аргумента, все детали должны быть получены в кортеже или в диктовке?