Как создать определенные структурированные метаданные для использования? - PullRequest
2 голосов
/ 18 февраля 2020

Я начал изучать python и пытался прочитать файл журнала, имеющий определенную структуру

12 34 20 02 02 14 15 10 03 02 03 0A 00 02 60 17 0A 80 0B 00 01 72 0B 80 0C 00 01 45 0C 80
56 78 20 02 02 14 15 10

Данные могут быть декодированы как:

12 34                   --> First file number (2 bytes)
20 02 02 14 15 10       --> file written date (6 bytes)
03 02                   --> File Id
03                      --> No of files

0A 00   --> sub file number 1 start
02      --> length of the file
20 07   --> data in the file
0A 80   --> sub file number 1 end

0B 00   --> sub file number 2 start
01      --> length of the file
72      --> data in the file
0B 80   --> sub file number 2 end

0C 00   --> sub file number 3 start
01      --> length of the file
45      --> data in the file
0C 80   --> sub file number 3 end


56 78               --> Second file number (2 bytes)
20 02 02 14 15 10   --> file written date (6 bytes)
.......
........
...

На основе "Нет of Files "value = 3, следующие 3 раздела должны быть 3 порциями данных с началом, длиной, данными внутри файла и конечным значением.

После этого раздела, снова другой раздел с аналогичными данными структуры должен быть доступно.

Я пытался читать побайтово, но подумал, что это можно определить правильно и, будучи новичком, пытаюсь узнать python подробнее.

# First file number
byte = file.read(2)
hexadecimal = binascii.hexlify(byte)
print("First File number      : %s" %(codecs.decode(hexadecimal, "hex").decode('ascii')))

# code for date

# First file Id
byte = file.read(2)
hexadecimal = binascii.hexlify(byte)
print("First File Id      : %s" %(codecs.decode(hexadecimal, "hex").decode('ascii')))

Как это можно записать в лучший способ? Кроме того, если я запишу эту логику c в другом файле, передав файл в качестве входного аргумента, все детали будут извлечены в кортеже или в текстовом формате?

1 Ответ

1 голос
/ 24 февраля 2020

Посмотрите на модуль 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 в другом файле, передав файл в качестве входного аргумента, все детали должны быть получены в кортеже или в диктовке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...