Python解析DAT二进制文件:多记录读取与字符串清理问题
解决二进制文件解析的两个问题
1. 读取所有800+条记录
原代码仅读取了单条26字节的记录,要遍历所有记录,只需循环读取文件直到读到空字节流即可:
import struct with open('file.dat', mode="rb") as binFile: while True: # 每次读取一条记录的26字节(int占4字节+字符串占22字节) binData = binFile.read(26) # 读取到空字节串表示文件已读完 if not binData: break data = struct.unpack('i22s', binData) print(data)
注意:with语句会自动关闭文件,原代码中的binFile.close()属于冗余代码,可直接删除
2. 提取有效字符串'PROV111'
从输出的字节串b'N\x07\x00PROV111\x00\x00...'来看,有效字符串被空字符\x00分隔,且前面存在无效前缀。提供两种提取方案:
方案一:按空字符分割筛选
import struct with open('file.dat', mode="rb") as binFile: while True: binData = binFile.read(26) if not binData: break num, raw_str = struct.unpack('i22s', binData) # 解码字节串为字符串,忽略无法解码的无效字符 decoded_str = raw_str.decode('utf-8', errors='ignore') # 按空字符分割后过滤空内容,提取含PROV的有效部分 valid_parts = [part for part in decoded_str.split('\x00') if 'PROV' in part] valid_str = valid_parts[0] if valid_parts else '' print(f"数字:{num},有效字符串:{valid_str}")
方案二:正则精准匹配
如果确定有效字符串是PROV开头加数字的格式,用正则匹配更高效:
import struct import re with open('file.dat', mode="rb") as binFile: # 匹配PROV开头+数字的字节串模式 prov_pattern = re.compile(rb'PROV\d+') while True: binData = binFile.read(26) if not binData: break num, raw_str = struct.unpack('i22s', binData) # 在字节串中直接匹配目标内容 match_result = prov_pattern.search(raw_str) valid_str = match_result.group().decode('utf-8') if match_result else '无有效字符串' print(f"数字:{num},有效字符串:{valid_str}")
完整整合代码
结合两个需求的最终代码:
import struct import re with open('file.dat', mode="rb") as binFile: prov_pattern = re.compile(rb'PROV\d+') while True: binData = binFile.read(26) if not binData: break num, raw_str = struct.unpack('i22s', binData) match_result = prov_pattern.search(raw_str) valid_str = match_result.group().decode('utf-8') if match_result else '无有效字符串' print(f"记录:数字={num},有效字符串={valid_str}")
内容的提问来源于stack exchange,提问作者Marco Somoza
相关产品推荐
相关产品推荐

