Python逐行统计文件标点时累计计数异常问题解决方案
问题说明
逐行读取文件统计标点符号(初始需求为统计逗号)数量时,现有程序输出的是累计到当前行的标点总计数,无法单独展示每一行对应的标点个数,需要调整代码实现逐行独立统计,分别输出各行的标点计数结果。
原有问题代码
f = open("file.txt", "r") cout = 0 vcout = 0 zap = 0 while 1: l = f.readline() cout += 1 zappr = '.' in l zappr1 = '?' in l zappr2 = '!' in l zappr3 = '...' in l zappr4 = ',' in l zappr5 = ';' in l zappr6 = ':' in l zappr7 = '-' in l zappr8 = '(' in l zappr9 = ')' in l zappr10 = '"' in l if zappr == True or zappr1 == True or zappr2 == True or zappr3 == True or zappr4 == True or zappr5 == True or zappr6 == True or zappr7 == True or zappr8 == True or zappr9 == True or zappr10 == True: zap += 1 print('On line',zap,'punctuation marks') if not l: break print('In file',cout-1,'lines') print('In file',zap+1,'punctuation marks') f.close()
原有程序错误输出
On line 0 punctuation marks On line 1 punctuation marks On line 2 punctuation marks On line 2 punctuation marks On line 3 punctuation marks On line 3 punctuation marks On line 4 punctuation marks On line 4 punctuation marks
问题根因
- 标点计数变量
zap定义在循环外侧,每次检测到标点就做全局累加,没有在每行统计开始时重置为当前行的独立计数值 - 判断逻辑仅校验行内是否存在某类标点,没有统计标点的实际出现次数,只要行内包含对应标点就只加1,计数结果不准确
- 循环终止判断位置靠后,读到文件末尾的空值时仍然执行了计数、打印逻辑,会多输出一行无效统计
- 省略号
...和单个句号.的判断逻辑重叠,会出现重复计数问题
修改后可直接运行的代码
# 待统计标点列表,多字符的省略号放在最前避免重复计数 punct_list = ['...', '.', '?', '!', ',', ';', ':', '-', '(', ')', '"'] total_line = 0 total_punct = 0 # 用with上下文管理器自动处理文件关闭,避免资源泄漏 with open("file.txt", "r", encoding="utf-8") as f: line_idx = 0 while True: content = f.readline() # 读到文件末尾直接终止循环,不做无效统计 if not content: break line_idx += 1 total_line += 1 # 每行单独初始化计数变量,不沿用上一行的累加结果 line_punct = 0 # 优先统计省略号,统计后替换掉已统计的省略号,避免和单个句号重复计数 ellipsis_num = content.count('...') line_punct += ellipsis_num content_processed = content.replace('...', '') # 统计剩余所有单字符标点 for p in punct_list[1:]: line_punct += content_processed.count(p) total_punct += line_punct print(f'第 {line_idx} 行共有 {line_punct} 个标点符号') print(f'文件总计 {total_line} 行') print(f'文件总计 {total_punct} 个标点符号')
内容的提问来源于stack exchange,提问作者juelz
相关产品推荐
相关产品推荐

