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

从TXT文件提取小时并统计出现次数,如何调整代码以通过Pytest断言?

从TXT文件提取小时并统计出现次数,如何调整代码以通过Pytest断言?

问题分析

从你的pytest失败信息能直接看出核心问题:输出格式不匹配。你的代码打印的是带括号和引号的元组字符串(比如('04', 3)),但测试用例期望的是小时 次数这种空格分隔的纯文本格式,每行一条记录。另外你提取小时的逻辑还有冗余错误,需要简化优化。

修正后的完整代码

def exercise_10_2():
    hour_counts = {}
    name = 'mbox-short.txt'
    if len(name) < 1:
        name = "mbox-short.txt"
    
    # 使用with语句自动管理文件资源,避免泄漏
    with open(name) as handle:
        for line in handle:
            # 精准匹配以"From "开头的行(带空格,避免误匹配From:)
            if line.startswith('From '):
                words = line.split()
                # 提取时间字段,按冒号拆分直接取小时部分
                time_str = words[5]
                hour = time_str.split(':')[0]
                # 一行完成计数,省去判断键是否存在的分支
                hour_counts[hour] = hour_counts.get(hour, 0) + 1
    
    # 按小时排序后,输出测试用例期望的格式
    for hour, count in sorted(hour_counts.items()):
        print(f"{hour} {count}")

关键修改点说明

  • 简化小时提取逻辑:原代码里time = word[5].split()和hr = word[5].format_map(time)完全冗余,直接把时间字符串(比如09:14:16)按冒号:拆分,取第一个元素就是小时,简单高效。
  • 调整输出格式:把原代码的print(item)改成print(f"{hour} {count}"),直接输出小时 次数的纯文本格式,完全匹配测试用例的要求。
  • 优化计数逻辑:用hour_counts.get(hour, 0) + 1替代原有的条件判断,一行代码完成计数,让逻辑更简洁。
  • 规范文件操作:用with语句替代直接open文件,会自动处理文件关闭,是Python文件操作的最佳实践。

验证输出

运行修正后的代码,输出会完全匹配pytest断言的期望内容:

04 3
06 1
07 1
09 2
10 3
11 6
14 1
15 2
16 4
17 2
18 1
19 1

这样就能顺利通过pytest的断言检查了。

备注:内容来源于stack exchange,提问作者Brian Fulton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:33:12