从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
相关产品推荐
相关产品推荐

