Python文件行数统计函数首次调用正常,重复调用返回0的问题求助
Python文件行数统计函数首次调用正常,重复调用返回0的问题求助
嘿,这个问题其实很常见,核心原因和文件对象的指针位置有关!
你第一次调用findn()的时候,已经把文件里的内容从头到尾遍历了一遍,这时候文件对象datahandle的指针会停在文件的末尾位置。当你第二次调用函数时,再去循环datahandle,因为指针已经在末尾了,没有更多内容可以迭代,所以循环根本不会执行,count保持为0,自然输出0。
接下来给你几个解决方案,你可以根据需求选择:
方案1:每次调用函数时重新打开文件(推荐)
这种方法最稳妥,也符合Python的最佳实践——用with语句管理文件,它会自动帮你关闭文件,避免资源泄漏。同时每次打开文件都会重置指针到开头,不管调用多少次都能得到正确结果:
def findn(): count = 0 # 用with语句打开文件,自动处理关闭逻辑 with open("dataset.txt") as datahandle: for _ in datahandle: # 其实这里rstrip()不影响行数统计,除非有空行需要过滤,按需保留 count += 1 return count # 调用方式更规范,不需要全局变量 print(findn()) # 输出10 print(findn()) # 再次调用还是输出10
如果你想更简洁,还可以用生成器表达式来统计,内存效率更高(尤其适合大文件):
def findn(): with open("dataset.txt") as f: return sum(1 for _ in f)
方案2:重置文件指针到开头
如果你想要复用已经打开的文件对象,可以在每次循环前用seek(0)把指针移回文件开头,这样就能重新遍历内容了:
# 先打开文件 datahandle = open("dataset.txt") def findn(): global count count = 0 # 关键:重置指针到文件起始位置 datahandle.seek(0) for countingdata in datahandle: countingdata = countingdata.rstrip() count += 1 findn() print(count) # 10 findn() print(count) # 还是10
不过这里要提醒你,尽量避免使用global变量,它会让代码的可读性和维护性变差。方案1的返回值写法会更规范哦。
你之前尝试把count定义在函数外面没用,就是因为问题根本不在count的位置,而是文件指针已经走到末尾了,循环根本没机会执行~
备注:内容来源于stack exchange,提问作者donpizzly
相关产品推荐
相关产品推荐

