python 将 type c_ubyte_Array 的数据保存为 .data 格式的文件
时间: 2024-09-30 11:13:42 浏览: 39
在Python中,如果你有一个`c_ubyte_Array`类型的数组,它通常是来自于像C或C++这样的语言的结构化数据,想要将其保存为`.data`格式文件,通常是指二进制文件。可以使用内置的`struct`模块来进行序列化操作。首先,你需要确定数组的大小以及元素在内存中的排列方式(是否是字节对齐),然后按照指定的格式字符串将数据打包。
下面是一个简单的步骤示例:
```python
import struct
# 假设你有如下c_ubyte_Array变量
c_ubyte_array = [0x01, 0x02, 0x03, 0x04, ...] # 需要替换为实际的二进制数据
# 获取数组的总长度(假设每个元素占用1个字节)
array_length = len(c_ubyte_array)
file_format = 'B' * array_length # 使用'>'表示大端字节序,如果是小端字节序则用'<'
# 创建一个新的bytes对象
byte_data = struct.pack(file_format, *c_ubyte_array)
# 写入到.data文件中
with open('output.data', 'wb') as f:
f.write(byte_data)
```
在这个例子中,`'B'*array_length`指定了每个元素都是一个8位无符号整数(`c_ubyte`)。你可以根据实际需要修改`file_format`。
相关问题
class VCI_INIT_CONFIG(Structure): _fields_ = [("AccCode", c_uint), ("AccMask", c_uint), ("Reserved", c_uint), ("Filter", c_ubyte), ("Timing0", c_ubyte), ("Timing1", c_ubyte), ("Mode", c_ubyte) ] class VCI_CAN_OBJ(Structure): _fields_ = [("ID", c_uint), ("TimeStamp", c_uint), ("TimeFlag", c_ubyte), ("SendType", c_ubyte), ("RemoteFlag", c_ubyte), ("ExternFlag", c_ubyte), ("DataLen", c_ubyte), ("Data", c_ubyte*8), ("Reserved", c_ubyte*3) ] class VCI_CAN_OBJ_ARRAY(Structure): _fields_ = [('SIZE', c_uint16), ('STRUCT_ARRAY', POINTER(VCI_CAN_OBJ))] def __init__(self,num_of_structs): #这个括号不能少 self.STRUCT_ARRAY = cast((VCI_CAN_OBJ * num_of_structs)(),POINTER(VCI_CAN_OBJ))#结构体数组 self.SIZE = num_of_structs#结构体长度 self.ADDR = self.STRUCT_ARRAY[0]#结构体数组地址 byref()转c地址 转换为C语言
这段代码中使用了Python的ctypes库来定义C语言中的结构体和数组。在C语言中,结构体和数组都是一种内存布局,因此在使用ctypes库时,需要通过定义结构体的_fields_属性来指定结构体中各成员的类型和名称,同时使用POINTER()来定义结构体数组,并通过cast()将其转换为指向结构体的指针类型。在初始化函数中,通过self.STRUCT_ARRAY和self.SIZE分别存储结构体数组的地址和长度,并使用byref()将其转换为C语言中的地址类型。这样,就可以在Python中定义C语言的数据结构,并将其传递给C语言程序进行操作。
# -*- coding: utf-8 -*- """ Transform the data type from ascii to ubyte format (8 bits unsigned binary) and save to new files, which would reduce the data size to 1/3, and would save the data transforming time when read by the python @author: Marmot """ import numpy as np import time from itertools import islice import pandas as pd # data_folder = '../../data/' set_list = ['train','testA','testB'] size_list = [10000,2000,2000] time1= time.time() for set_name,set_size in zip(set_list,size_list): output_file = data_folder + set_name + '_ubyte.txt' f = open(output_file, "w") f.close() Img_ind = 0 input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: Img_ind = Img_ind +1 print('transforming ' + set_name + ': ' + str(Img_ind).zfill(5)) line = content.split(',') title = line[0] + ' '+line[1] data_write = np.asarray(line[2].strip().split(' ')).astype(np.ubyte) data_write = (data_write + 1).astype(np.ubyte) if data_write.max()>255: print('too large') if data_write.min()<0: print('too small') f = open(output_file, "a") f.write(data_write.tobytes()) f.close() time2 = time.time() print('total elapse time:'+ str(time2- time1)) #%% generate train label list value_list =[] set_name = 'train' input_file = data_folder + set_name +'.txt' with open(input_file) as f: for content in f: line = content.split(',') value_list.append(float(line[1])) value_list = pd.DataFrame(value_list, columns=['value']) value_list.to_csv(data_folder + 'train_label.csv',index = False,header = False)
这段代码的主要功能是将数据集中的图像像素值从 ASCII 码转换为无符号 8 位二进制格式,并保存到新文件中,同时生成训练集标签列表。
代码首先定义了一个数据路径列表 `set_list` 和一个数据子集大小列表 `size_list`。然后通过循环遍历每个数据子集,对每个子集执行以下操作:
1. 定义了一个输出文件路径 `output_file`,并创建一个空文件;
2. 读取输入文件 `input_file`,遍历每个图像像素值,并将其转换为无符号 8 位二进制格式;
3. 将转换后的图像像素值写入输出文件中;
4. 遍历完成后,输出文件中将包含整个数据子集的所有图像像素值。
注意,代码中的 `data_folder` 变量指定了数据集所在的文件夹路径。
另外,代码的最后还生成了训练集标签列表。具体来说,代码读取训练集文件 `train.txt`,提取其中的标签信息,并将标签保存到一个 CSV 文件 `train_label.csv` 中,以供后续的模型训练使用。
阅读全文