如何将gu1格式二进制文件转换为CSV文件或DataFrame?
解决GU1二进制文件转CSV/DataFrame的问题
问题核心
你的myfile.gu1是包含多行70列数据的二进制文件,第一列为系统时间。当前代码将所有数据按单列输出,完全破坏了原有行列结构;之前尝试的方案要么出现乱码(字节序或文件头解析错误),要么无法自动化且速度慢。
优化后的解决方案
方案1:转换为CSV文件(含表头)
import os import struct import csv # 配置参数 COLUMN_COUNT = 70 # 固定70列 FILENAME = 'myfile.gu1' # 自定义表头,第一列是系统时间,其余可根据实际需求补充 HEADERS = ['系统时间'] + [f'列_{i}' for i in range(1, COLUMN_COUNT)] # 构建文件路径 cwd = os.getcwd() file_path = os.path.join(cwd, 'Desktop', FILENAME) csv_path = os.path.join(cwd, 'Desktop', f'{os.path.splitext(FILENAME)[0]}.csv') # 读取二进制数据并按70列分组 data_rows = [] with open(file_path, 'rb') as f: while True: # 一次读取一行的字节数:70列 × 4字节/浮点数 row_bytes = f.read(COLUMN_COUNT * 4) if not row_bytes: break # 解析为浮点数列表,注意字节序:如果乱码就换成'<f'或'>f' row_data = struct.unpack(f'{COLUMN_COUNT}f', row_bytes) data_rows.append(row_data) # 写入CSV文件 with open(csv_path, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(HEADERS) # 写入表头 writer.writerows(data_rows)
方案2:直接转换为Pandas DataFrame(方便绘图)
import os import struct import pandas as pd # 配置参数 COLUMN_COUNT = 70 FILENAME = 'myfile.gu1' HEADERS = ['系统时间'] + [f'列_{i}' for i in range(1, COLUMN_COUNT)] # 构建文件路径 cwd = os.getcwd() file_path = os.path.join(cwd, 'Desktop', FILENAME) # 读取并解析数据 data = [] with open(file_path, 'rb') as f: while True: row_bytes = f.read(COLUMN_COUNT * 4) if not row_bytes: break # 若乱码尝试修改字节序:'<f'(小端)或'>f'(大端) row_data = struct.unpack(f'{COLUMN_COUNT}f', row_bytes) data.append(row_data) # 转为DataFrame df = pd.DataFrame(data, columns=HEADERS) # 可选:保存为CSV df.to_csv(os.path.join(cwd, 'Desktop', f'{os.path.splitext(FILENAME)[0]}.csv'), index=False, encoding='utf-8') # 直接用于绘图示例 df.plot(x='系统时间', y='列_1') # 替换为你需要的列名
关键说明
- 行列结构修复:按70个浮点数为一组分割数据,还原原文件的行列结构,解决当前代码单列输出的问题。
- 乱码处理:如果转换后仍有异常值,修改
struct.unpack的格式符:'f':默认本机字节序'<f':小端字节序(多数Windows设备使用)'>f':大端字节序(部分嵌入式设备使用)
- 表头自定义:
HEADERS列表可根据实际测量参数修改,替换成真实的表头名称。 - 性能优化:一次性读取一行的字节数,比逐字节读取效率更高,适合大文件处理。
内容的提问来源于stack exchange,提问作者fix_my_bug
相关产品推荐
相关产品推荐

