2008-09-29 6 views
8

Вопрос, как и вопрос this, я пытаюсь прочитать в заголовке тега ID3v2, и мне трудно понять, как получить отдельные байты в python.Как читать байты из файла в 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] 

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

ответ

16

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

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

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

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

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

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

Going вашего кодом, вы ищете (в порядке убывания):

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

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

ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string) 
2

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

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

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

+0

Для «H» вам нужно использовать 2-байтовый срез. – Brian 2008-09-29 21:00:32

+0

Вы правы, я забыл об этом. Я исправлю свой пример, чтобы он работал, но ваш ответ - лучший ответ. – 2008-09-29 22:13:21

4

Почему написать свой собственный? (Предполагая, что вы не проверили эти другие варианты.) Там есть пара опций для чтения в тегах ID3-тегов из MP3-файлов в Python. Проверьте мой вопрос answer на вопрос this.

2

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

FWIW, есть already a module для этого.

Смежные вопросы