逐行读取文本统计FBC值,达标时停止并保存指定行数据
解决FBC统计与目标数据提取问题
我看你现在的问题是要处理存储闪存测试数据的文本文件,需要统计每个Block下的FBC条目,直到遇到FBC值≥500的条目时停止,并且保存该FBC条目上方的那行数据里的特定字段对吧?之前的代码逻辑有点绕,而且拆分了两次文件读取,导致数据跟踪出错,咱们来一步步修正这个问题。
问题分析
你的核心目标是:
- 按
Block分组处理数据 - 每个Block内统计FBC条目数量,直到FBC≥500时停止统计
- 保存该FBC条目上方行里的十六进制数据段(比如
DFFFBFFF,FFBBFFFF,FCFFFF8F,FDFBFFCC这类)
之前的代码主要问题在于:
- 分两次读取文件,没法关联
Block、FBC计数和目标数据的对应关系 - 没有正确存储每个Block对应的FBC计数和目标数据,导致输出混乱
- 逻辑判断里的
found标记没有很好地控制每个Block内的处理流程
解决方案代码
这里我写了一份整合逻辑的代码,一次性读取文件,按Block分组处理,同时跟踪计数和目标数据:
import re # 存储最终结果:每个Block对应的(统计数, 目标数据) result = [] current_block_data = { 'count': 0, 'target_data': None, 'found': False # 标记当前Block是否已找到FBC≥500的条目 } # 编译FBC匹配正则,提高效率 fbc_pattern = re.compile(r'FBC\s*=\s*(\d+)') with open('Test.txt', 'r') as f: for line in f: line = line.strip() if not line: continue # 遇到新的Block,重置当前Block的统计状态 if line.startswith('Block'): # 如果上一个Block有有效数据,加入结果列表 if current_block_data['found']: result.append( (current_block_data['count'], current_block_data['target_data']) ) # 重置状态 current_block_data = { 'count': 0, 'target_data': None, 'found': False } continue # 如果当前Block已经找到符合条件的FBC,跳过后续行 if current_block_data['found']: continue # 处理包含FBC的行 if 'FBC =' in line: current_block_data['count'] += 1 # 提取FBC数值 match = fbc_pattern.search(line) if match: fbc_value = int(match.group(1)) # 当FBC≥500时,标记当前Block处理完成(已保存上方行数据) if fbc_value >= 500: current_block_data['found'] = True else: # 非FBC行,提取我们需要保存的十六进制数据段 if 'Cycle= 1' in line: # 拆分行,取Cycle=1之后、Page之前的部分 parts = line.split('Cycle= 1,') if len(parts) > 1: hex_part = parts[1].split(', Page =')[0].strip() current_block_data['target_data'] = hex_part # 处理最后一个Block的数据 if current_block_data['found']: result.append( (current_block_data['count'], current_block_data['target_data']) ) # 输出结果 for idx, (count, data) in enumerate(result, 1): print(f"第{idx}部分统计数为{count},保存{data}")
代码逻辑说明
- 状态跟踪:用
current_block_data字典跟踪当前Block的统计数、目标数据和是否已找到符合条件的FBC,确保每个Block独立处理,互不干扰。 - 正则匹配:预编译FBC的正则表达式,比每次临时匹配更高效,能准确提取FBC数值。
- 数据提取:遇到包含
Cycle=1的行时,精准提取其中的十六进制数据段——这就是你要保存的FBC条目上方的对应行数据。 - Block切换处理:每次遇到新的
Block时,将上一个Block的有效结果存入列表,然后重置状态,开始处理新Block的数据。
预期输出
运行这段代码后,你会得到完全符合需求的输出:
第1部分统计数为3,保存DFFFBFFF,FFBBFFFF,FCFFFF8F,FDFBFFCC 第2部分统计数为4,保存DFFFFFFC,FFBBFFFB,FFEFFF8F,FDFBFDDD
内容的提问来源于stack exchange,提问作者Sadman Sakib
相关产品推荐
相关产品推荐

