2016-04-27 25 views
0

私はバイナリデータファイルを持っています。データ構造は次のとおりです。Python - バイナリデータサイズカットと書き込み

3つの整数(それぞれ4バイト)は、それぞれx、y、z方向のポイント数を表します。 【領域内の点の総数が[X Y Z]

次いで最初のパラメータ(例えば、速度)のX Y Zフローティング番号(4バイトずつ)読み取り、データは次のように整形されていますx、y、z]は非常に大きいので、20ポイントごとにポイントを選んでデータサイズをカットし、次にバイナリ形式でサイズカットデータを書き込むことを目指しています。新しいファイル。

これをPythonでコーディングするのは難しいと思います。それを実現する方法を教えてもらえますか?事前にありがとう!

答えて

0

mode="rb"でデータファイルを開き、モジュールstructを使用してデータを解釈することができます。

はのバイナリファイル(エラーチェックなしのCコード)を作成してみましょう:

#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 

今、私たちは、ファイルを読み取り、ジェネレータ関数で解釈置きます。残りは簡単です:

$ 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 
>>> 

新しいファイルがあなたの助けを

+0

感謝:-)演習として残しておき書きます。私は、ループを使用してPythonでデータサイズをカットする方法を理解していません。あなたはそれを手伝ってもらえますか? – Max