Python for循环解析二进制所得值如何转为指定列的DataFrame
解决方案
核心思路:每次struct.unpack返回的元组本身就是一一对应的(time, count)单行数据,不需要内层循环拆成单个值打印,先把所有行收集到列表中,再一次性转为DataFrame即可。
修正后的完整代码
import struct import pandas as pd def bin_to_raw(file): data_rows = [] # 每次步进12字节,对应单条记录的长度(8字节long类型time + 4字节int类型count) for i in range(0, len(file), 12): # 解包直接得到成对的time、count值 time_val, count_val = struct.unpack('< q i', file[i:i + 12]) data_rows.append((time_val, count_val)) # 构造DataFrame,指定列名和预期格式一致 result_df = pd.DataFrame(data_rows, columns=['time', 'count']) return result_df
说明
- 原代码的内层
for values in data循环会把成对的time、count拆成独立值逐个输出,破坏了行对应关系,直接去掉这层循环即可。 - 最终返回的
result_df格式完全匹配需求,time列和count列的值一一对应,和当前打印输出的数值顺序完全一致。 - 如果要复用原有代码里定义的
field_names变量,可以把DataFrame构造的columns参数改为columns=field_names,无需重复写列名。 - 原代码中定义的
header_len = 12目前没有实际作用,如果二进制文件实际存在12字节的文件头,只需要把range的起始值从0改成header_len即可跳过头部内容,从有效数据段开始解析。 - 注意传入的
file参数必须是二进制读取得到的bytes对象,读取源文件时需要用rb模式打开,否则struct解析会出现异常。
内容的提问来源于stack exchange,提问作者user13071308
相关产品推荐
相关产品推荐

