Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python的文件中的行数会擦除文件_Python_File_Python 3.x_Count - Fatal编程技术网

使用Python的文件中的行数会擦除文件

使用Python的文件中的行数会擦除文件,python,file,python-3.x,count,Python,File,Python 3.x,Count,我试图计算一个文件中的行数,但结果很奇怪。下面是一个MWE,我相信它本身就说明了这一点: file=open('Example.txt','r') print(sum(1 for line in file)) print(len(file.readlines())) 当我运行这个程序时,我会得到输出X(正确的行数)和0。因此,第二种方法要么不起作用,要么读取一个空变量。如果我切换顺序,我会得到相同的结果,所以它是工作的,但不知何故变量被删除了。如果我用同一个文件分配文件1和文件2,并用不同的

我试图计算一个文件中的行数,但结果很奇怪。下面是一个MWE,我相信它本身就说明了这一点:

file=open('Example.txt','r')

print(sum(1 for line in file))
print(len(file.readlines()))
当我运行这个程序时,我会得到输出
X
(正确的行数)和
0
。因此,第二种方法要么不起作用,要么读取一个空变量。如果我切换顺序,我会得到相同的结果,所以它是工作的,但不知何故变量被删除了。如果我用同一个文件分配
文件1
文件2
,并用不同的变量运行每个方法,我得到X和X,因此变量在完成操作后被删除

我还试图从
“r”
改为
“r+”
,但运气不好。有人能解释一下这里发生了什么吗??对列表的操作不应该改变列表,至少我被教导过

谢谢大家!

发生的是:

print(sum(1 for line in file))
读取文件并耗尽提供行的迭代器

当你这样做时:

print(len(file.readlines()))
您将以
0
结束,因为迭代器在上一次迭代中已耗尽。使用
file.seek(0)
可以再次遍历它

另一个注意事项是,在读取文件时无需使用
'r'
,它已经是默认模式


通常,通过检查iter(obj)是obj,您可以发现迭代器在迭代一次后会耗尽:

f = open('example.txt')
print(iter(f) is f) # True
如果是这种情况,
obj.\uuuu iter\uuu
在其实现中返回
self
,从而导致所见证的行为

如果不是,以列表为例:

l = [1, 2]
print(iter(l) is l) # False

\uuuuuuuuuuuuuuuuuuuuuuuuuu
方法返回一个闪亮的新迭代器对象(对于列表,这是一个可以多次迭代的
列表迭代器对象)。

哇,谢谢,我不知道会发生这种事情。这个迭代器显式声明在哪里?我怎么知道什么时候会遇到这个问题?根据我使用C和MATLAB的经验,我必须重置迭代器,但在Python中,我真的认为这是一个内部过程。“r”是我原始代码的遗留代码,我将使用“r+”,但是谢谢你的注释!它是内置的,所以它是在
C
中实现的(非常确定位于)。通过检查
iter(obj)是obj
,可以发现迭代器在迭代一次后会耗尽。如果是这种情况,
obj.\uuuu iter\uuu
在其实现中返回
self
,从而导致所见证的行为。如果不是,则
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法将返回一个闪亮的新迭代器对象,该对象可以在@alegom中多次迭代。您对我何时应该注意此事件有何建议?在本例中,我的文件有15行。谁知道迭代器会这么快耗尽?它耗尽了,因为您通读了所有迭代器。总的来说,要努力做到务实。如果允许多次迭代(比如列表、元组、e.t.c之类的Python集合)是非常有意义的,那么很可能是这样。如果不是(文件通常只读取一次并处理数据),则可能不是。如果需要确定的话,您可以并且应该输入Python REPL并使用iter(obj)is obj检查,尽管@AlegomIt是有意义的。谢谢你的帮助,吉姆·法萨拉基斯·希利亚德。我们每天都在学习!