2016-04-27 7 views
0

Ich habe eine binäre Datei. Die Datenstruktur ist wie folgt:Python - Binäre Datengröße-schneiden und Schreiben

Drei ganze Zahlen (jeweils 4 Bytes) repräsentieren die Anzahl der Punkte in x-, y-, z-Richtung. [Die Gesamtzahl der Punkte in der Region ist [x y z]

Dann x lesen y z Gleitpunktzahlen (je 4 Byte) für den ersten Parameter (beispielsweise Geschwindigkeit), werden die Daten als ein umgeformter matrix [x, y, z]

Da x, y, z sehr groß ist, möchte ich den Punkt alle zwanzig Punkte wählen, um die Größe der Daten zu schneiden und dann die Größe geschnittenen Daten im Binärformat zu schreiben eine neue Datei.

Ich finde es schwierig, dies in Python zu kodieren. Kann mir jemand sagen, wie man das realisiert? Vielen Dank im Voraus!

Antwort

0

Sie könnten die Datendatei mit mode="rb" öffnen und das Modul struct verwenden, um die Daten zu interpretieren.

Lasst uns eine Binärdatei (C-Code ohne Fehlerprüfung) erstellen:

#include <stdio.h> 
int main() 
{ 
    FILE *fp = fopen("data.bin", "wb"); 
    int data[] = { 
     2, 3, 5, 
     553, 827, 189, 680, 587, 
     817, 969, 186, 701, 964, 
     260, 527, 408, 236, 429, 
     768, 447, 826, 520, 937, 
     492, 180, 599, 785, 296, 
     876, 670, 145, 283, 206 
    }; 
    fwrite(data, sizeof(data), 1, fp); 
    fclose(fp); 
} 

$ ls data.bin 
-rw-rw-r-- 1 user user 132 Apr 27 18:45 data.bin 

$ hd data.bin 
00000000 02 00 00 00 03 00 00 00 05 00 00 00 29 02 00 00 |............)...| 
00000010 3b 03 00 00 bd 00 00 00 a8 02 00 00 4b 02 00 00 |;...........K...| 
00000020 31 03 00 00 c9 03 00 00 ba 00 00 00 bd 02 00 00 |1...............| 
00000030 c4 03 00 00 04 01 00 00 0f 02 00 00 98 01 00 00 |................| 
00000040 ec 00 00 00 ad 01 00 00 00 03 00 00 bf 01 00 00 |................| 
00000050 3a 03 00 00 08 02 00 00 a9 03 00 00 ec 01 00 00 |:...............| 
00000060 b4 00 00 00 57 02 00 00 11 03 00 00 28 01 00 00 |....W.......(...| 
00000070 6c 03 00 00 9e 02 00 00 91 00 00 00 1b 01 00 00 |l...............| 
00000080 ce 00 00 00          |....| 
00000084 

Jetzt haben wir die Datei setzen zu lesen und in einer Generatorfunktion zu interpretieren. Der Rest ist einfach:

$ python3.5 
Python 3.5.0+ (default, Oct 11 2015, 09:05:38) 
[GCC 5.2.1 20151010] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import struct 
>>> def read_ints(filename): 
...  with open(filename, "rb") as f: 
...   byte = f.read(4) 
...   while byte: 
...    yield struct.unpack("i", byte)[0] 
...    byte = f.read(4) 
... 
>>> for i in read_ints("data.bin"): 
...  print(i) 
... 
2 
3 
5 
553 
827 
189 
680 
587 
817 
969 
186 
701 
964 
260 
527 
408 
236 
429 
768 
447 
826 
520 
937 
492 
180 
599 
785 
296 
876 
670 
145 
283 
206 
>>> 

die neue Datei zu schreiben ist als Übung :-)

+0

Vielen Dank für Ihre Hilfe. Ich verstehe nicht ganz, wie man in Python mit den Loops die Datengröße schneidet. Könntest du mir dabei helfen? – Max