前言 如题所述,本文将介绍Python和C之间的数据交互问题。我们的目标是,在Python中将结构性数据保存为二进制文件,然后在C中将二进制文件数据加载到结构体,直接就可以使用,不需要再进行其他的数据转换。在Python中将结构性数据保存为二进制文件 作为测试,这里我们使用的结构性数据,其数据结构如下:typedefstruct{inta;floatb;intarray〔10〕;array〔10〕;intmatrix〔3〕〔3〕;matrix〔3〕〔3〕;floattensor〔2〕〔3〕〔4〕;tensor〔2〕〔3〕〔4〕;}MyStruct; 通过下面的代码,即可将上述结构性数据保存为二进制文件data。bin:importstructimportnumpyasnp定义多个嵌套的Struct实例structintfloatstruct。Struct(if)structarraystruct。Struct(10i)structmatrixstruct。Struct(9i)structtensorstruct。Struct(24f)inta123floatb3。14intarray〔1,2,3,4,5,6,7,8,9,10〕intmatrix〔〔1,2,3〕,〔4,5,6〕,〔7,8,9〕〕floattensor〔〔〔1。1,1。2,1。3,1。4〕,〔2。1,2。2,2。3,2。4〕,〔3。1,3。2,3。3,3。4〕〕,〔〔4。1,4。2,4。3,4。4〕,〔5。1,5。2,5。3,5。4〕,〔6。1,6。2,6。3,6。4〕〕〕由列表转为数组格式,方便后面进行一维展开intarraynp。array(intarray)intmatrixnp。array(intmatrix)floattensornp。array(floattensor)将结构体实例中的各字段打包为字节串多维数组需要先进行一维展开,然后才能进行打包packedabstructintfloat。pack(inta,floatb)packedarraystructarray。pack(intarray)packedmatrixstructmatrix。pack(intmatrix。flatten())packedtensorstructtensor。pack(floattensor。flatten())将各字段的字节串连接为最终的字节串packeddatapackedabpackedarraypackedmatrixpackedtensor将字节串写入二进制文件withopen(data。bin,wb)asf:f。write(packeddata)print(〔Info〕Finished) 运行结果如下图所示: 在Python中将二进制文件解析出来,验证数据是否正确 上面我们将结构性数据保存为了二进制文件,那么在python中我们如何将二进制文件解析成结构性数据呢?至少我们得验证一下保存的文件是否正确。 完整的代码如下:importstructimportnumpyasnp定义多个嵌套的Struct实例structintfloatstruct。Struct(if)structarraystruct。Struct(10i)structmatrixstruct。Struct(9i)structtensorstruct。Struct(24f)从二进制文件中读取数据withopen(data。bin,rb)asf:packeddataf。read()解包数据为元组dataabstructintfloat。unpack(packeddata〔:8〕)dataarraystructarray。unpack(packeddata〔8:48〕)datamatrixstructmatrix。unpack(packeddata〔48:84〕)datatensorstructtensor。unpack(packeddata〔84:180〕)将解包后的数据转换为结构体实例先转成array格式,方便后面的reshape操作inta,floatbdataabintarraynp。array(dataarray)intmatrixnp。array(datamatrix)floattensornp。array(datatensor)intmatrixintmatrix。reshape(3,3)floattensorfloattensor。reshape(2,3,4)print()print(finta{inta})print(floatb{:。4f}。format(floatb))print()print(intarray{}。format(intarray))print()print(intmatrix{}。format(intmatrix))print()print(floattensor{}。format(floattensor。round(4)))print()print(〔Info〕Finished) 程序运行结果如下图所示(可以看到,数据与我们保存进去的是一致的): 在C中读取二进制文件,直接加载到结构体 在前言中我们提到,我们的目的就是在C中直接将Python保存的二进制数据加载到结构体进行使用,不需要再做额外的数据转换。那么,该如何做呢?请看下面的完整代码:includefstreamincludeiostreamusingnamespacestd;typedefstruct{inta;floatb;intarray〔10〕;array〔10〕;intmatrix〔3〕〔3〕;matrix〔3〕〔3〕;floattensor〔2〕〔3〕〔4〕;tensor〔2〕〔3〕〔4〕;}MyStruct;intmain(){std::stringfilepathdata。bin;打开要读取的二进制文件std::ifstreaminputfile(filepath,std::ios::binary);检查文件是否成功打开if(!inputfile。isopen()){文件打开失败std::coutopenfilepathfailed!std::endl;return1;}获取文件大小inputfile。seekg(0,std::ios::end);std::streamposfilesizeinputfile。tellg();inputfile。seekg(0,std::ios::beg);std::coutfilesizefilesizestd::endl;读取文件到缓冲区charbuffernewchar〔filesize〕;inputfile。read(buffer,filesize);关闭文件inputfile。close();将缓冲区中的数据转换为结构体MyStructmystructreinterpretcastMyStruct(buffer);输出结构体的数据std::coutstd::endl;std::coutamystructastd::endl;std::coutbmystructbstd::endl;std::coutstd::endl;std::coutarray〔;intarraylensizeof(mystructarray)sizeof(mystructarray〔0〕);for(inti0;iarraylen;i){std::coutmystructarray〔i〕,;}std::cout〕std::endl;std::coutstd::endl;std::coutmatrix〔std::endl;for(inti0;i3;i){std::cout〔;for(intj0;j3;j){std::coutmystructmatrix〔i〕〔j〕,;}std::cout〕,std::endl;}std::cout〕std::endl;std::coutstd::endl;std::couttensor〔std::endl;for(inti0;i2;i){std::cout〔;for(intj0;j3;j){std::cout〔;for(intk0;k4;k){std::coutmystructtensor〔i〕〔j〕〔k〕,;}std::cout〕,std::endl;}std::cout〕,std::endl;}std::cout〕std::endl;std::coutstd::endl;delete〔〕buffer;return0;} 程序运行效果,如下图所示: 可以看到,我们在C中读取二进制数据后,直接加载到结构体中,最终显示出来的正是我们预期的数据。 至此,关于在Python中如何将C结构体数据保存为二进制文件的介绍就结束了,希望对大家能有所帮助。如果觉得不错的话,可以帮忙点个赞哦。