8 Stimmen

Wie kann man in Python Bytes aus einer Datei lesen?

Ähnlich wie diese Frage, ich versuche, in einem ID3v2-Tag-Header zu lesen und habe Probleme herauszufinden, wie man einzelne Bytes in Python zu erhalten.

Zuerst lese ich alle zehn Bytes in eine Zeichenkette ein. Dann möchte ich die einzelnen Informationen auslesen.

Ich kann die zwei Versionsnummer Zeichen in der Zeichenfolge zu greifen, aber dann habe ich keine Ahnung, wie diese zwei Zeichen zu nehmen und eine Ganzzahl aus ihnen zu erhalten.

Das struct-Paket scheint zu sein, was ich will, aber ich kann es nicht zum Laufen bringen.

Hier ist mein Code so-weit (ich bin sehr neu in Python btw...so nehmen Sie es einfach auf mich):

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]

Das Ausdrucken von Werten, die nicht korrekt formatiert sind, ist offensichtlich nicht möglich.

16voto

Brian Punkte 112487

Wenn Sie eine Zeichenkette mit 2 Bytes haben, die Sie als 16-Bit-Ganzzahl interpretieren möchten, können Sie dies tun, indem Sie:

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

Beachten Sie, dass das > für Big-Endian steht (der größte Teil der Ganzzahl kommt zuerst). Dies ist das Format, das id3-Tags verwenden.

Für andere Größen von Integer verwenden Sie andere Formatcodes. z.B. "i" für einen vorzeichenbehafteten 32-Bit-Integer. Siehe help(struct) für Details.

Sie können auch mehrere Elemente auf einmal auspacken. z.B. für 2 vorzeichenlose Shorts, gefolgt von einem vorzeichenbehafteten 32-Bit-Wert:

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

Ihrem Code nach zu urteilen, suchen Sie (in dieser Reihenfolge):

  • eine 3-stellige Zeichenkette
  • 2 Ein-Byte-Werte (Haupt- und Nebenversion)
  • eine 1-Byte-Merker-Variable
  • eine Menge von 32 Bit Länge

Der Formatstring hierfür wäre:

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

4voto

Owen Punkte 20897

Warum sollten Sie Ihr eigenes Buch schreiben? (Vorausgesetzt, Sie haben diese anderen Optionen noch nicht ausprobiert.) Es gibt ein paar Optionen, um ID3-Tag-Informationen von MP3s in Python einzulesen. Sehen Sie sich mein Antwort drüben bei diese Frage.

2voto

Greg Hewgill Punkte 882617

Ich wollte Ihnen den struct Paket, aber dann sagten Sie, Sie hätten es ausprobiert. Versuchen Sie dies:

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

En pack() setzt Python-Datentypen in Bits um, und die Funktion unpack() Funktion konvertiert Bits in Python-Datentypen.

2voto

Alex Coventry Punkte 64405

Ich versuche, einen ID3v2-Tag-Header einzulesen

FWIW, es gibt bereits ein Modul für diese.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X