读取二进制文件转文本字符串及解析数据的技术求助
问题与解决方案
问题描述
我读取一个二进制文件的代码如下:
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文件:用xlrdimport 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文件:用openpyxlfrom 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
相关产品推荐
相关产品推荐

