【问题标题】:Iterating on a file doesn't work the second time [duplicate]第二次迭代文件不起作用[重复]
【发布时间】:2022-11-18 09:26:10
【问题描述】:

我在迭代文件时遇到问题。这是我在解释器上输入的内容和结果:

>>> f = open('baby1990.html', 'rU')
>>> for line in f.readlines():
...  print(line)
... 
# ... all the lines from the file appear here ...

当我尝试再次迭代同一个打开的文件时,我什么也没得到!

>>> for line in f.readlines():
...  print(line)
... 
>>>

根本没有输出。要解决这个问题,我必须close()该文件,然后再次打开它进行阅读!这是正常行为吗?

【问题讨论】:

    标签: python file iteration


    【解决方案1】:

    是的,这是正常行为。你基本上是第一次读到文件的末尾(你可以把它想象成读磁带),所以你不能再读了,除非你重置它,通过使用 f.seek(0) 重新定位到文件的开头,或者关闭它然后再次打开它将从文件的开头开始。

    如果您愿意,可以改用 with 语法,它会自动为您关闭文件。

    例如。,

    with open('baby1990.html', 'rU') as f:
      for line in f:
         print line
    

    一旦这个块执行完,文件就会自动为你关闭,所以你可以重复执行这个块,而不用自己明确关闭文件,然后以这种方式重新读取文件。

    【讨论】:

    • 如果您使用readlines(),则没有理由两次读取文件。
    • “U”在 python 3 中已弃用。
    【解决方案2】:

    当文件对象读取文件时,它使用一个指针来跟踪它的位置。如果您阅读了文件的一部分,稍后再返回,它将从您离开的地方继续阅读。如果你读取整个文件,然后返回到同一个文件对象,这就像读取一个空文件一样,因为指针位于文件的末尾,没有任何东西可以读取。您可以使用file.tell() 查看指针在文件中的位置,并使用file.seek 设置指针。例如:

    >>> file = open('myfile.txt')
    >>> file.tell()
    0
    >>> file.readline()
    'one
    '
    >>> file.tell()
    4L
    >>> file.readline()
    '2
    '
    >>> file.tell()
    6L
    >>> file.seek(4)
    >>> file.readline()
    '2
    '
    

    此外,您应该知道 file.readlines() 读取整个文件并将其存储为列表。知道这一点很有用,因为您可以替换:

    for line in file.readlines():
        #do stuff
    file.seek(0)
    for line in file.readlines():
        #do more stuff
    

    和:

    lines = file.readlines()
    for each_line in lines:
        #do stuff
    for each_line in lines:
        #do more stuff
    

    您还可以迭代一个文件,一次一行,而不用将整个文件保存在内存中(这对于非常大的文件非常有用),方法是:

    for line in file:
        #do stuff
    

    【讨论】:

      【解决方案3】:

      文件对象是一个缓冲.当您从缓冲区读取时,您读取的那部分会被消耗掉(读取位置向前移动)。当你读完整个文件时,读取的位置在文件的末尾(EOF),所以它什么都不返回,因为没有什么可读的了。

      如果由于某种原因必须重置文件对象的读取位置,您可以执行以下操作:

      f.seek(0)
      

      【讨论】:

        【解决方案4】:

        当然。 这是正常而理智的行为。 您可以rewind文件,而不是关闭并重新打开。

        【讨论】:

        • 这对不熟悉读指针概念的用户没有帮助
        猜你喜欢
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多