我有一个二进制数据文件。数据结构如下:
三个整数(每个4个字节)分别表示x,y,z方向上的点数。 [该地区的总点数为[x y z]
然后读取第一个参数(例如速度)的x y z浮点数(每个4个字节),将数据重新整形为矩阵[x,y,z]
因为x,y,z非常大,所以我的目标是每20个点选择一个点来削减数据大小,然后在新文件中以二进制格式写出大小剪切数据。
我发现用Python编写代码很困难。谁能告诉我如何实现这一点?非常感谢提前!
答案 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
>>>
编写新文件留作练习: - )