Python程序:提取X-DSPAM-Confidence值并计算平均值
修复Python代码:计算X-DSPAM-Confidence平均值
先看一段常见的错误代码示例(大概率是你写的那版):
# 错误示例:仅打印匹配行,未处理数值计算 fname = input("Enter file name: ") fh = open(fname) for line in fh: if line.startswith('X-DSPAM-Confidence:'): print(line)
这个代码只完成了筛选行的步骤,完全没做数值提取和平均值计算,下面是两种正确的实现方式:
方式一:用for循环实现
# 初始化总和与计数,用浮点数避免整数除法问题 total_confidence = 0.0 count = 0 # 用with语句自动管理文件,不用手动关文件 fname = "mbox-short.txt" with open(fname, 'r') as fh: # 遍历文件每一行 for line in fh: # 筛选目标行 if line.startswith('X-DSPAM-Confidence:'): # 分割字符串提取数值:按冒号切分后取第二部分,去掉空白转成浮点数 confidence = float(line.split(':')[1].strip()) total_confidence += confidence count += 1 # 计算平均值,先判断有没有有效数据,防止除以0报错 if count > 0: average = total_confidence / count print(f"Average spam confidence: {average}") else: print("No X-DSPAM-Confidence lines found.")
关键细节:
with open(...)会在代码块结束后自动关闭文件,比手动调用close()更安全strip()必须加,因为冒号后的数值前后可能有空格或换行符,直接转浮点数会报错- 先判断
count > 0,避免没有匹配行时出现ZeroDivisionError
方式二:用while循环实现
total_confidence = 0.0 count = 0 fname = "mbox-short.txt" fh = open(fname, 'r') # 读取第一行,进入循环 line = fh.readline() while line: if line.startswith('X-DSPAM-Confidence:'): confidence = float(line.split(':')[1].strip()) total_confidence += confidence count += 1 # 读取下一行,直到返回空字符串(文件结束) line = fh.readline() # 手动关闭文件 fh.close() if count > 0: average = total_confidence / count print(f"Average spam confidence: {average}") else: print("No X-DSPAM-Confidence lines found.")
关键细节:
readline()每次读取一行,返回空字符串时表示文件已经读完,循环结束- 这个版本需要手动调用
fh.close(),如果怕忘记,也可以把while循环放在with语句里
内容的提问来源于stack exchange,提问作者Edwin David
相关产品推荐
相关产品推荐

