Python使用bitstruct解析仪器二进制生成CSV 如何简化多字段写入
实现方案
你可以通过Python内置的csv模块配合bitstruct.unpack返回的元组特性实现,完全不用手动写超长格式化字符串,还能自动处理CSV转义逻辑,避免文本字段含逗号、引号时格式错乱。
具体步骤
- 先定义好所有字段的表头列表,你只需要手动写一次对应关系,后续读写都可以复用:
# 自定义表头,按二进制解析顺序排列即可 header_fields = ["版本号", "仪器ID", "采集日期", "备注"] # 正文字段按body_format的解析顺序填写,对应你100多个字段的实际含义 body_fields = ["字段1名称", "字段2名称", ..., "字段N名称"]
- 改写原有读写逻辑,用
csv.writer处理写入,unpack返回的元组可以直接传入写入方法:
import csv from bitstruct import unpack, calcsize_in_bytes header_format = 'u32u8u32t8192' header_size = calcsize_in_bytes(header_format) body_format = 'u4u4u1u1u1u1u4u16t96f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32s16s16f32f32u16u16f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32f32<' body_size = calcsize_in_bytes(body_format) with open('instrument.dat','rb') as f, open('instrument.csv','w', encoding='utf-8', newline='') as w: # 初始化csv写入器 csv_writer = csv.writer(w) # 写入CSV表头行 csv_writer.writerow(header_fields + body_fields) # 解析文件头 header_values = unpack(header_format, f.read(header_size)) # 解析正文循环 while True: body_bytes = f.read(body_size) # 读到文件末尾退出循环 if len(body_bytes) < body_size: break body_values = unpack(body_format, body_bytes) # 拼接文件头信息+正文字段,直接写入行,不用手动拼接字符串 csv_writer.writerow(list(header_values) + list(body_values))
额外说明
- 如果你的CSV不需要每行都带文件头的4个字段,只需要把表头改成
body_fields,写入时只传body_values即可。 - 可以提前校验
len(body_fields)和body_format解析出来的字段数量是否一致,避免顺序错位:只要调用unpack(body_format, b'x'*body_size)看返回的元组长度和你定义的body_fields长度是否相等就行。 newline=''是Python csv模块的标准写法,可以避免Windows系统下写入CSV出现多余空行。
内容的提问来源于stack exchange,提问作者user2728912
相关产品推荐
相关产品推荐

