Python文本统计程序故障求助:行数、词数、元音数统计异常
问题排查与修复方案
原代码核心问题
- 行读取逻辑错误:
for line in fileIn已经逐行迭代文件内容,内部又调用fileIn.readline(),会跳过奇数行,导致行数统计少一半。 - 词数统计偏差:
line.split(" ")会把连续空格、制表符等拆出空字符串,导致词数多算,应该用无参数的line.split()(自动忽略任意空白字符)。 - 总统计逻辑混乱:原代码把总统计放在
else分支(空行判断),完全错误,应该在每一行处理时就累加总行数、总词数、总元音数;且原总元音统计是判断单词是否包含元音,而非统计每个单词里的元音总数,逻辑完全错误。 - 文件不存在处理缺失:原代码未实现输入文件不存在时引导重新输入的功能,需要用
os.path.exists判断文件是否存在。 - 元音统计代码冗余:逐个字母
count重复且繁琐,可以统一处理大小写后统计。
修复后的代码
import os # 处理文件输入,直到用户输入存在的文件 while True: filename = input("File name: ") if os.path.exists(filename): break print("File does not exist, please try again.") fileIn = open(filename, 'r') fileOut = open("answer.txt", 'w') numLines = 0 totVowels = 0 totWords = 0 vowels = 'aeiouAEIOU' # 定义所有元音字符 for line in fileIn: numLines += 1 # 统计行词数:split()自动处理任意空白,过滤空字符串 line_words = line.split() numWords = len(line_words) # 统计行元音数:遍历每个字符,判断是否是元音 numVowels = 0 for char in line: if char in vowels: numVowels += 1 # 写入行统计结果 fileOut.write(f"Line number: {numLines}\n") fileOut.write(f"Number of vowels in line {numLines}: {numVowels}\n") fileOut.write(f"Number of words in line {numLines}: {numWords}\n\n") # 累加总统计 totWords += numWords totVowels += numVowels # 写入总统计结果 fileOut.write("+++++++++++++++++\n") fileOut.write(f"Total number of vowels in file: {totVowels}\n") fileOut.write(f"Total number of words in file: {totWords}\n") print("answer.txt file created.") fileIn.close() fileOut.close()
修复说明
- 文件输入处理:用
while循环结合os.path.exists判断文件是否存在,直到用户输入有效文件名。 - 行读取修复:移除内部的
fileIn.readline(),直接使用for line in fileIn迭代每一行,确保所有行都被处理。 - 词数统计修复:使用
line.split()替代line.split(" "),正确统计单词数量(自动忽略空格、制表符、换行符等空白)。 - 元音统计优化:定义元音字符串
vowels,遍历行内每个字符判断是否为元音,简化代码且逻辑正确;同时在行处理时直接累加到总元音数,无需额外循环。 - 总统计逻辑修正:每处理一行就累加总词数和总元音数,最后统一写入底部,逻辑清晰正确。
内容的提问来源于stack exchange,提问作者Soren
相关产品推荐
相关产品推荐

