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

如何在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)}")

代码优势

  1. 扩展性强:无需修改代码,新增命令类型会自动被识别并记录
  2. 高效简洁:一次遍历完成数据提取、统计和时间记录,比原代码的多分支判断更高效
  3. 安全可靠:使用with语句管理文件,避免忘记关闭文件的问题
  4. 易维护:直接按分隔符解析行数据,比正则表达式更直观,降低维护成本

输出效果

运行代码后会得到如下格式的结果:

* 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:10:37