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

读取二进制文件转文本字符串及解析数据的技术求助

问题与解决方案

问题描述

我读取一个二进制文件的代码如下:

file = open("TPSDisplay/Reader/radio_log.BIN","rb")
lines = file.read(100)
file.close()

运行print(lines)后输出:

'\r\n01659963148.977->>(\x00\x00\x00\xa5v\xe6A\x0033\x0033\x00\x00\x00\x00\x00\x00\xd9\xfb\x00\x0c\x17\x90\x01M\x04\x00\x00\x00\x1d\xb3\x1c\xf6\x8ep\xf7N\xf6\x00\x00\r\n01659963148.977->>(\x00\x00\x00\xa5v\xe6A\x0033\x0033\x00\x00\x00'

我希望按\r分割该字符串并进行常规字符串操作,但lines并非普通字符串对象,无法实现。另外我认为这些十六进制数据代表Excel表格(该二进制文件通常输出此类内容),希望能指导解析长数字后的相关数据。


解决方法

1. 把bytes对象转成字符串再操作

用rb模式读文件得到的是bytes类型,不是字符串,必须先解码才能做分割、替换等字符串操作:

# 读取二进制数据(用with语句自动关闭文件更规范)
with open("TPSDisplay/Reader/radio_log.BIN", "rb") as f:
    lines_bytes = f.read(100)

# 解码成字符串,优先尝试utf-8,乱码的话换gbk/latin-1
lines_str = lines_bytes.decode("utf-8", errors="ignore")
# 按\r分割
split_result = lines_str.split("\r")
print(split_result)
  • errors="ignore"用于跳过无法解码的二进制字节,避免解码报错;如果想完整保留所有字节的原始字符映射,可以用latin-1编码解码。

2. 解析疑似Excel的二进制数据

如果文件里确实包含Excel数据,直接用字符串处理效率低且容易出错,推荐用专业库:

  • 处理旧版.xls文件:用xlrd
    import xlrd
    # 打开文件(需确认文件实际是xls格式)
    wb = xlrd.open_workbook("TPSDisplay/Reader/radio_log.BIN")
    # 获取第一个工作表
    sheet = wb.sheet_by_index(0)
    # 读取A1单元格数据
    print(sheet.cell_value(0, 0))
    
  • 处理新版.xlsx文件:用openpyxl
    from openpyxl import load_workbook
    # 打开文件(需确认文件实际是xlsx格式)
    wb = load_workbook("TPSDisplay/Reader/radio_log.BIN")
    # 获取活跃工作表
    sheet = wb.active
    # 读取A1单元格数据
    print(sheet["A1"].value)
    
  • 注意:从输出看,文件开头有日志文本(比如01659963148.977->>),可能是日志与Excel数据混合的格式。这种情况需要先分离出Excel数据块:xls文件起始标记是\xd0\xcf\x11\xe0,xlsx是PK开头的压缩包标记,找到标记后截取对应部分保存为单独文件,再用上述库解析。

内容的提问来源于stack exchange,提问作者Governor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:06:19