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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:19:54