Python - 二进制数据大小切割和写入

时间:2016-04-27 15:39:06

标签: python binary data-visualization

我有一个二进制数据文件。数据结构如下:

三个整数(每个4个字节)分别表示x,y,z方向上的点数。 [该地区的总点数为[x y z]

然后读取第一个参数(例如速度)的x y z浮点数(每个4个字节),将数据重新整形为矩阵[x,y,z]

因为x,y,z非常大,所以我的目标是每20个点选择一个点来削减数据大小,然后在新文件中以二进制格式写出大小剪切数据。

我发现用Python编写代码很困难。谁能告诉我如何实现这一点?非常感谢提前!

1 个答案:

答案 0 :(得分: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
>>>

编写新文件留作练习: - )