我试图计算文件中的行数,但我的结果很奇怪。下面是一个MWE,我相信它不言自明:
file=open('Example.txt','r')
print(sum(1 for line in file))
print(len(file.readlines()))
当我运行时,我得到输出X
(正确的行数)和0
。所以第二种方法要么不起作用,要么读取空变量。如果我切换顺序,我得到相同的结果,所以它工作但不知何故变量被删除。如果我使用相同的文件分配file_1
和file_2
并使用不同的变量运行每个方法,我会得到X和X,因此在完成操作后变量将被删除。
我也尝试从"r"
更改为"r+"
,但没有运气。谁能解释一下这里发生了什么?列表上的操作不应该改变列表,至少是我所教过的内容。
谢谢!
答案 0 :(得分:3)
会发生什么:
print(sum(1 for line in file))
读取文件并耗尽提供行的迭代器。
然后你这样做:
print(len(file.readlines()))
你最终得到0
,因为迭代器已经从前一次迭代中耗尽。使用file.seek(0)
可以再次迭代它。
另外需要注意,在阅读文件时无需使用'r'
,这是默认模式。
一般情况下,通过检查iter(obj) is obj
,您可以发现迭代器在迭代完毕后会耗尽:
f = open('example.txt')
print(iter(f) is f) # True
如果是这种情况,obj.__iter__
会在其实施中返回self
,从而导致所见证的行为。
如果没有,例如取名单:
l = [1, 2]
print(iter(l) is l) # False
__iter__
方法返回一个闪亮的新迭代器对象(对于列表,这是一个list_iterator
对象),可以多次迭代。