2016-12-15 4 views
0

Ich habe eine Klasse geschrieben, die das Header-Segment der Datendatei analysiert (um wissenschaftliche Gerätedaten zu speichern) und Dinge wie Offsets zu verschiedenen Datensegmenten innerhalb der Datei sammelt. Die tatsächlichen Daten werden durch verschiedene Verfahren erhalten, die die Datensegmente lesen und parsen.Puffer/Stream zum Lesen einer Teilmenge einer Datei in Python?

Das Problem, auf das ich gestoßen bin, ist, dass ein Segment für anbieterspezifische, unstrukturierte Daten definiert ist. Da es nichts zu analysieren gibt, brauche ich nur meine Methode, um rohe Binärdaten zurückzugeben. Allerdings könnte dieses Segment sehr groß sein, also möchte ich nicht nur alles auf einmal lesen und ein einziges bytes Objekt zurückgeben.

Was ich tun möchte, ist die Methode ein io.BufferedReader Objekt oder ähnliches in die Datei zurückgeben, die nur zwischen einem Anfang und Ende Offset liest. Ich war nicht in der Lage, einen Weg zu finden, dies mit den eingebauten IO-Klassen zu tun. Ist es möglich?

Antwort

0

Sie erben alle Klassenmethoden von IOBase, so dass Sie absolut reader.seek (byte_offset) aufrufen können, um zu dieser Byteposition im Stream zu springen. Von dort müssen Sie die Bytes, die Sie gelesen haben, manuell nachverfolgen, bis Sie den maximalen Offset erreichen, den Sie gerade lesen. Der Start-Offset für seek() muss natürlich vorher bekannt sein, ebenso wie der End-Byte-Offset. Einige Beispiel-Code folgt (unter der Annahme eines Start von Byte 250 Offset):

import io 

stream = io.open("file.txt", "r") 
buffered_reader = io.BufferedReader(stream) 
# set the stream to byte 250 
buffered_reader.seek(250) 
# read up to byte 750 (500 bytes from position 250) 
data = buffered_reader.read(500) 

Natürlich, wenn dieser Header dynamisch Größe ist ... Sie haben zu scannen Startpositionen zu bestimmen, die Lese Zeile für Zeile bedeutet.

+0

Diese Frage bezieht sich mehr auf die API - Ich möchte die Methode, um einen Stream zurückgeben, die nur aus diesem Segment der Datei liest, ohne dass der Anrufer sich sorgen muss, was die tatsächlichen Offsets sind. – JaredL

+0

Angenommen, der Header ist dynamisch im Aufbau? wenn ja, muss ich mit dem Scannen gehen, um den Startpunkt zu bestimmen. Es gibt keinen magischen API-Aufruf auf dem io-Modul oder seinen Klassen, der automatisch weiß, wo bei jeder gegebenen Datei zu beginnen ist, wenn der Startpunkt von einer bestimmten Kopfzeilenlänge abhängt. –

+0

Vielleicht habe ich die Frage nicht klar formuliert. Ich habe die Datei bereits analysiert und weiß, wo die Offsets sind. Ich möchte, dass dies für jeden anderen Code, der das Modul verwendet, vollkommen transparent ist, so dass es einfach nach einem Stream für das Datensegment fragen kann, ohne etwas über das Dateiformat oder die Interna zu wissen. – JaredL