You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:52:56