python将数据存为二进制,并用C读取

python将数据存为二进制,并用c读取

python保存二进制文件

python将float32类型的numpy数组以二进制形式保存到txt文本中 代码

with open("D:\xxx\xxx\xxx\xxx\conv1.txt",wb) as f:
    f.write(checkpoint[state_dict][conv1.weight].flatten().numpy().astype(float32))

上述有三个值得注意的地方: 1.必须是numpy数组,不能是list。numpy能达到目的就用numpy吧,list为什么不能保存也不管了。 如果是保存list数组,将会出现如下错误 2.二进制体现在参数 “wb” 3.保存为二进制文件,文件后缀名用 .txt 就行,不要用 .bin ,不要画蛇添足,我开始以为要用.bin 折腾了好半天。

证明是真的二进制文件: (懒得下nodepad++读取二进制的插件了)

python读取二进制文件到numpy数组

网上很多通过用struct实现的,试了下并没有读取成功 通过这篇文章学到了直接读入到numpy数组就行。 可以reshape成为numpy数组保存前的shape。 conv1_weight=conv1_weight.reshape(16,1,3,3,3)

c语言读取二进制文件到数组

python中保存的数组是float32类型的,c端当然也要用float去装这些数据。 代码:

#include <stdio.h>
int main()
{
          
   
	FILE *fp = fopen("D:\10GraduationProject\vedioData\data_process\ucf5\fc6.txt", "rb");
	fseek(fp, 0, SEEK_END);
	int fileSize = ftell(fp);
	int arraySize = fileSize / sizeof(float);
	printf("arraySize:%d
",arraySize);
	fseek(fp, 0, SEEK_SET);
	float* fc6_weight=new float[arraySize];
	printf("len of float: %d
", sizeof(float));
	fread(fc6_weight, sizeof(float), arraySize, fp);
	printf("%.18f ", fc6_weight[arraySize-1]);
	delete[] fc6_weight;
	fclose(fp);
	return 0;
}

别忘记fclose(fp)了。上面的fclose是后面补加的。 读取结果: 和python中的numpy的最后一个元素对比: python保存二进制文件,以及c语言读取二进制文件到数组,几百兆的数据瞬间完成(目测不到1秒) 完美,收工!!!

后续疑问

但存在一个问题 在Debug x86模式下,出现如下错误: 我在预处理器中添加了 _CRT_SECURE_NO_WARNINGS,问题依然在,不知为何

我用fopen_s呢,又出现这样的错误 不知道啥原因,有知道的朋友麻烦在评论区回复一下。 改成 x64(并且在预处理器中添加_CRT_SECURE_NO_WARNINGS) 就没啥问题了。

值得学习的文章

经验分享 程序员 微信小程序 职场和发展