我正在尝试计算文件中的行数,但得到了奇怪的结果。下面有一个 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+"
,但没有成功。有人可以解释一下这里发生了什么吗?对列表的操作不应更改列表,至少我是这么教的。
谢谢!
最佳答案
发生的情况是:
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__
方法返回一个 Shiny 的新迭代器对象(对于列表,这是一个 list_iterator
对象),可以多次迭代。
关于python - 使用Python删除文件中的文件行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41334806/