Como é que um Leia Bytes de arquivo em Python
Pergunta
esta questão , eu estou tentando ler em um cabeçalho tag ID3v2 e estou tendo dificuldade para descobrir como obter bytes individuais em python.
li pela primeira vez todos os bytes dez em uma string. Eu, então, quer para analisar os pedaços individuais de informação.
Eu posso pegar os dois caracteres número de versão no corda, mas então eu não tenho nenhuma idéia como tomar esses dois caracteres e obter um inteiro fora delas.
O pacote de struct parece ser o que eu quero, mas não posso fazê-lo funcionar.
Aqui está o meu código até-agora (eu sou muito novo para python btw ... para levá-lo fácil para mim):
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]
Impressão de qualquer valor, exceto é, obviamente, uma porcaria, porque eles não estão formatados corretamente.
Solução
Se você tem uma corda, com 2 bytes que você deseja interpretar como um inteiro de 16 bits, você pode fazê-lo:
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
Note que a> é para big-endian (a maior parte do número inteiro vem em primeiro lugar). Este é o formato ID3 tags de usar.
Para outros tamanhos de inteiro, você usa códigos de formato diferentes. por exemplo. "I" para um pouco inteiro assinado de 32. Consulte a ajuda (struct) para mais detalhes.
Você também pode descompactar vários elementos de uma só vez. por exemplo, para 2 calções sem sinal, seguido por um valor de 32 bits com sinal:
>>> a,b,c = struct.unpack('>HHi', some_string)
Indo pelo seu código, você está procurando (em ordem):
- a 3 texto CHAR
- 2 valores de byte simples (versão maior e menor)
- a bandeiras variável 1 byte
- uma quantidade comprimento de 32 bits
A cadeia de formato para isso seria:
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
Outras dicas
Por que escrever o seu próprio? (Supondo que você não fez check-out essas outras opções.) Há um par de opções lá fora, para ler na ID3 tag informações de MP3s em Python. Confira a minha resposta href="https://stackoverflow.com/questions/8948/accessing-mp3-meta-data-with-python#102285"> sobre a this questão .
Eu estou tentando ler em um cabeçalho ID3v2 tag
FWIW, há já um módulo para isso.
Eu ia recomendar o pacote struct
mas depois você disse que tinha tentado. Tente isto:
self.major_version = struct.unpack('H', self.whole_string[3:5])
A função pack()
convers Python tipos de dados para os bits e os bits convertidos função unpack()
para tipos de dados Python.