如何在Python中为命令关联对应时间戳?
需求与现有代码
现有文本文件page_stats.txt,第三列包含多种命令类型(如ACTIVE、REFRESH等)。当前代码仅能统计各类命令的出现次数,希望优化后为每个命令关联对应的发生时间,同时保留统计功能。
现有代码:
import re a = a_1 = b = b_1 = c = d = e = 0 lines = open("page_stats.txt", "r").readlines() for line in lines: if re.search(r"WRITING_A", line): a_1 += 1 elif re.search(r"WRITING", line): a += 1 elif re.search(r"READING_A", line): b_1 += 1 elif re.search(r"READING", line): b += 1 elif re.search(r"PRECHARGE", line): c += 1 elif re.search(r"ACTIVE", line): d += 1
文件内容示例:
----------------------------------------------------------------- | Number | Time | Command | Data | ----------------------------------------------------------------- | 1 | 0015 | ACTIVE | | | 2 | 0030 | WRITING | | | 3 | 0100 | WRITING_A | | | 4 | 0115 | PRECHARGE | | | 5 | 0120 | REFRESH | | | 6 | 0150 | ACTIVE | | | 7 | 0200 | READING | | | 8 | 0314 | PRECHARGE | | | 9 | 0318 | ACTIVE | | | 10 | 0345 | WRITING_A | | | 11 | 0430 | WRITING_A | | | 12 | 0447 | WRITING | | | 13 | 0503 | PRECHARGE | | | 14 | 0610 | REFRESH | |
优化方案
核心思路
用字典统一存储数据:键为命令名称,值为该命令对应的所有时间列表。这种方式无需提前枚举所有命令,新增命令会自动被捕获,同时能直接获取次数(列表长度)和所有时间记录,一次遍历完成两种需求。
实现代码
# 初始化空字典,用于存储命令-时间列表的映射 command_time_map = {} # 使用with语句安全读取文件,自动处理关闭操作 with open("page_stats.txt", "r") as file: for line in file: # 跳过表头行和分隔线(不含有效数据的行) if "Command" in line or line.strip().startswith("---"): continue # 按|分割行内容,清理每个部分的空格 line_parts = [segment.strip() for segment in line.split("|") if segment.strip()] # 确保分割后有足够的有效字段(至少包含Number、Time、Command) if len(line_parts) >= 3: time_str = line_parts[1] command = line_parts[2] # 若命令不在字典中,先创建空列表;再将时间添加到对应列表 if command not in command_time_map: command_time_map[command] = [] command_time_map[command].append(time_str) # 输出统计结果和对应时间 for cmd, times in command_time_map.items(): print(f"* {cmd}: 共出现 {len(times)} 次,发生时间:{', '.join(times)}")
代码优势
- 扩展性强:无需修改代码,新增命令类型会自动被识别并记录
- 高效简洁:一次遍历完成数据提取、统计和时间记录,比原代码的多分支判断更高效
- 安全可靠:使用
with语句管理文件,避免忘记关闭文件的问题 - 易维护:直接按分隔符解析行数据,比正则表达式更直观,降低维护成本
输出效果
运行代码后会得到如下格式的结果:
* ACTIVE: 共出现 3 次,发生时间:0015, 0150, 0318 * WRITING: 共出现 2 次,发生时间:0030, 0447 * WRITING_A: 共出现 3 次,发生时间:0100, 0345, 0430 * PRECHARGE: 共出现 3 次,发生时间:0115, 0314, 0503 * REFRESH: 共出现 2 次,发生时间:0120, 0610 * READING: 共出现 1 次,发生时间:0200
内容的提问来源于stack exchange,提问作者CJ. T
相关产品推荐
相关产品推荐

