Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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中的file对象是iterable吗_Python_Iterable - Fatal编程技术网

python中的file对象是iterable吗

python中的file对象是iterable吗,python,iterable,Python,Iterable,我有一个文件“test.txt”: 下面的代码 lines = open("test.txt", 'r') for line in lines: print "loop 1:"+line for line in lines: print "loop 2:"+line 仅打印: loop 1:this is 1st line loop 1:this is 2nd line loop 1:this is 3rd line 它根本不打印loop2 两个问题: open()返回的

我有一个文件“test.txt”:

下面的代码

lines = open("test.txt", 'r')
for line in lines:
    print "loop 1:"+line
for line in lines:
    print "loop 2:"+line
仅打印:

loop 1:this is 1st line

loop 1:this is 2nd line

loop 1:this is 3rd line
它根本不打印loop2

两个问题:

  • open()返回的file对象是否为iterable?这就是为什么它可以在for循环中使用

  • 为什么loop2根本没有打印出来


  • 您的文件已在文件末尾。文件对象是迭代器。一旦你对它们进行迭代,你就到达了最终的位置。再次迭代不会从头开始。如果要再次从第1行开始,则需要使用
    行。seek(0)
    是的,文件对象是迭代器

    与所有迭代器一样,您只能在它们上循环一次,然后迭代器将耗尽。文件读取指针位于文件末尾。重新打开文件,如果需要再次循环,请使用
    .seek(0)
    倒带文件指针


    或者,尽量避免在文件上循环两次;在第一个循环期间,将您需要的内容提取到另一个数据结构(列表、字典、集合、堆等)中。

    是的,文件对象是可编辑的,但要返回到文件的开头,您需要使用
    行。seek(0)
    ,因为在第一个循环之后,您位于文件的末尾。

    它不仅是可编辑的,还是迭代器,这就是为什么它只能遍历文件一次。您可以按照许多人的建议使用
    .seek(0)
    重置文件光标,但在大多数情况下,您应该只迭代一次文件。

    不过,最好重写代码,这样文件就不需要迭代两次。将所有行读入某种类型的列表,或者在一个循环中执行所有处理。

    +1对于iterable-vs.-迭代器这件事,有一个很好的、简洁的描述(尽管它是问题的关键,但大多数其他答案都没有尝试过)。谢谢你的描述。这是误导<代码>列表s也是可编辑的,但是您可以在不使用
    搜索
    或等效程序的情况下再次迭代它们。问题在于文件对象是迭代器(也是可编辑的)。我是说迭代器。谢谢固定的。
    loop 1:this is 1st line
    
    loop 1:this is 2nd line
    
    loop 1:this is 3rd line