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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:01:23