Как читать байты из файла в Python - PullRequest
8 голосов
/ 30 сентября 2008

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

Сначала я прочитал все десять байтов в строку. Затем я хочу разобрать отдельные фрагменты информации.

Я могу взять два символа номера версии в строке, но тогда я понятия не имею, как взять эти два символа и получить из них целое число.

Мне кажется, что мне нужен пакет struct, но я не могу заставить его работать.

Вот мой код (я новичок в python, кстати ... так что успокойтесь):

def __init__(self, ten_byte_string):
        self.whole_string = ten_byte_string
        self.file_identifier = self.whole_string[:3]
        self.major_version = struct.pack('x', self.whole_string[3:4]) #this 
        self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
        self.flags = self.whole_string[5:6]
        self.len = self.whole_string[6:10]

Распечатка любого значения, кроме как, очевидно, дерьмо, потому что они не отформатированы правильно.

Ответы [ 4 ]

16 голосов
/ 30 сентября 2008

Если у вас есть строка с 2 байтами, которую вы хотите интерпретировать как 16-битное целое число, вы можете сделать это:

>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)

Обратите внимание, что> для старшего порядка (наибольшая часть целого числа идет первой). Этот формат используют теги id3.

Для других размеров целых чисел вы используете коды другого формата. например. «я» для 32-разрядного целого числа со знаком. Подробности см. В справке (структура).

Вы также можете распаковать несколько элементов одновременно. например, для 2 беззнаковых шорт, за которыми следует 32-битное значение со знаком:

>>> a,b,c = struct.unpack('>HHi', some_string)

Исходя из вашего кода, вы ищете (по порядку):

  • строка из 3 символов
  • 2 однобайтовых значения (основная и вспомогательная версия)
  • 1-байтовая переменная флагов
  • 32-битная длина

Строка формата для этого будет:

ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
4 голосов
/ 30 сентября 2008

Зачем писать свой? (Предполагая, что вы не отметили эти другие параметры.) Есть несколько вариантов для чтения информации тега ID3 из MP3 в Python. Посмотрите мой ответ на этом вопросе.

2 голосов
/ 30 сентября 2008

Я пытаюсь прочитать в заголовке тега ID3v2

FWIW, уже есть модуль для этого.

2 голосов
/ 30 сентября 2008

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

self.major_version = struct.unpack('H', self.whole_string[3:5])

Функция pack() переводит типы данных Python в биты, а функция unpack() преобразует биты в типы данных Python.

...