【问题标题】:Python refuses to iterate through lines in a file more than once [duplicate]Python拒绝多次遍历文件中的行[重复]
【发布时间】:2017-10-01 01:44:02
【问题描述】:

我正在编写一个程序,需要我多次遍历文件的每一行:

loops = 0
file = open("somefile.txt")
while loops < 5:
    for line in file:
        print(line)
    loops = loops + 1

为简洁起见,我假设我总是需要遍历文件并打印每行 5 次。该代码与我在程序中实现的较长版本具有相同的问题:该文件仅迭代一次。之后,print(line) 文件什么也不做。这是为什么呢?

【问题讨论】:

    标签: python


    【解决方案1】:

    这是因为file = open("somefile.txt") 行只出现一次,在循环之前。这将创建一个指向文件中一个位置的光标,因此当您到达第一个循环的末尾时,光标位于文件的末尾。将其移入循环:

    loops = 0
    while loops < 5:
        file = open("somefile.txt")
        for line in file:
            print(line)
        loops = loops + 1
        file.close()
    

    【讨论】:

    • “必须”是一个强词
    【解决方案2】:
    for loop in range(5):
        with open('somefile.txt') as fin:
            for line in fin:
                print(fin)
    

    这将重新打开文件五次。如果你愿意,你可以seek() 开始。

    【讨论】:

      【解决方案3】:

      for line in file 读取每一行一次。如果您想从第一行重新开始,您可以关闭并重新打开文件。

      【讨论】:

        【解决方案4】:

        Python 文件对象是迭代器。像其他迭代器一样,它们在耗尽之前只能迭代一次。尝试再次迭代会导致迭代器立即提升StopIteration(它没有任何剩余可产生的信号)。

        也就是说,文件对象确实让你有点作弊。与大多数其他迭代器不同,您可以使用他们的 seek 方法来回退它们。然后你可以再次迭代它们的内容。

        另一种选择是在每次需要对其进行迭代时重新打开该文件。这很简单,但是(忽略操作系统的磁盘缓存)重复读取文件可能有点浪费。

        最后一个选项是在程序开始时将文件的全部内容读入一个列表,然后对列表进行迭代,而不是直接对文件进行迭代。这可能是最有效的选择,只要文件足够小,一次将其全部内容放入内存中不成问题。

        【讨论】:

          【解决方案5】:

          当指针指向文件的最后一行时,请尝试使用 file.seek(0) 而不是在循环中一次又一次地打开文件

              with open('a.txt','r+')as f:
                  for i in range(0,5):
                      for line in f:
                          print(line)
                      f.seek(0)
          

          【讨论】:

            【解决方案6】:

            当您遍历它们时,文件默认被视为生成器表达式。如果您想逐行多次迭代文件,您可能需要先将文件转换为列表之类的东西。

            lines = open("somefile.txt").read().splitlines()
            
            for line in lines:
                print(line)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-12
              • 1970-01-01
              • 2015-05-25
              • 1970-01-01
              • 1970-01-01
              • 2012-02-17
              • 1970-01-01
              相关资源
              最近更新 更多