【问题标题】:Is file object in python an iterablepython中的文件对象是可迭代的吗
【发布时间】:2013-06-04 09:03:43
【问题描述】:

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

this is 1st line
this is 2nd line
this is 3rd line

以下代码

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。

两个问题:

  1. open() 返回的文件对象,它是可迭代的吗?这就是为什么它可以在 for 循环中使用?

  2. 为什么 loop2 根本不打印?

【问题讨论】:

    标签: python iterable


    【解决方案1】:

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

    【讨论】:

    • +1 以获得对 iterable-vs.-iterator 事物的简洁明了的描述(即使它是问题的关键,大多数其他答案甚至都没有尝试过)。跨度>
    • 感谢您的描述。
    【解决方案2】:

    是的,文件对象是迭代器。

    像所有迭代器一样,您只能循环遍历它们一次,之后迭代器就会耗尽。您的文件读取指针位于文件末尾。重新打开文件,如果需要再次循环,可以使用.seek(0)回退文件指针。

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

    【讨论】:

      【解决方案3】:

      是的,文件对象是可迭代的,但要返回文件的开头,您需要使用 lines.seek(0),因为在第一个循环之后,您就处于文件的末尾。

      【讨论】:

        【解决方案4】:

        您已经在文件末尾。文件对象是迭代器。一旦你遍历它们,你就处于最终位置。再次迭代不会从头开始。如果您想从第一行重新开始,您需要使用lines.seek(0)

        【讨论】:

        • 这是误导。 lists 也是可迭代对象,但您可以在没有 seek 或等效项的情况下再次迭代它们。问题是文件对象是 iterators (也是可迭代的)。
        • 错字。我的意思是迭代器。谢谢。固定。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 2014-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多