Python实现文本文件字符统计时 readlines 仅读取第一行问题
代码问题定位与修正
- 直接触发“仅统计第一行内容”的原因:代码中
main函数调用的是myFile.readline()(单数形式),该方法原生作用就是仅读取文件的单行内容,和你预期的readlines()(复数形式,读取全文件所有行)功能完全不同。 - 遗留逻辑缺陷1:即便把方法替换为
readlines(),直接将返回值传入countList也无法正常完成统计——readlines()返回的是由每行文本组成的字符串列表,此时函数内的循环会遍历整个行对象而非逐字符遍历,根本达不到字符维度统计的效果。 - 遗留逻辑缺陷2:原
countList的字符分类分支存在嵌套错误:当前代码将大写/小写的判断逻辑写在了ch.isspace()的分支内部,导致所有字母字符都无法命中大小写计数分支,全被归类到“非字母、数字、空格”的统计项中,计数结果完全失真。
针对以上问题的修正实现如下:
def countList(content_str): if len(content_str) == 0: return 0 totalChars = 0 digitCount = 0 spaceCount = 0 upperCase = 0 lowerCase = 0 notDigitOrAlphaOrSpace = 0 for ch in content_str: totalChars += 1 if ch.isdigit(): digitCount += 1 elif ch.isspace(): spaceCount += 1 elif ch.isalpha(): if ch.isupper(): upperCase += 1 else: lowerCase += 1 else: notDigitOrAlphaOrSpace += 1 print("Total characters:\t\t", totalChars) print("Total digits:\t\t", digitCount) print("Total spaces:\t\t", spaceCount) print("\tAlpha upper:\t", upperCase) print("\tAlpha lower:\t", lowerCase) print("Not an alpha or digit or space:\t", notDigitOrAlphaOrSpace) return totalChars def main(): # 使用with上下文管理器自动处理文件资源释放,避免文件句柄泄漏 with open('text.txt', 'r') as myFile: # 直接读取全文件为单个字符串,覆盖所有行的内容 full_content = myFile.read() numChars = countList(full_content) if numChars > 0: print("Your file was", numChars, "characters long") else: print("Your file had no characters.") main()
修正点:
- 替换文件读取逻辑,用
myFile.read()获取全文件完整字符串,覆盖所有行内容,避免逐行返回列表导致的遍历错位 - 调整
countList内的判定分支顺序,把字母类字符的判断独立为分支,修正原逻辑中大小写判断嵌套在空格分支内的错误 - 采用with上下文管理器管理文件句柄,避免文件未正常关闭的资源泄漏问题
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

