如何多次遍历文件?

时间:2019-11-26 09:37:43

标签: python file

当前,这段代码为我提供了searchfile中所有行一次。但是据我的新手了解,它应该为每searchfile行打印出infile的所有行!

searchfile = open('.\sometext.txt', 'r')
infile = open('.\somefile', 'r')

for line1 in infile:
    for line2 in searchfile:
        print line2

searchfile.close()
infile.close()

我尝试使用searchfile.readlines()创建一个列表,以打印所有infile行的所有searchfile行,但是仍然无法正常工作。有人有线索吗?

4 个答案:

答案 0 :(得分:6)

我想searchfile是您先前打开的文件,例如。 G。 searchfile = open('.\someotherfile', 'r')

在这种情况下,您的构造无法工作,因为文件是可迭代的,只能迭代一次,然后将其耗尽。

您在这里有两个选择:

  1. 每次外循环都重新打开文件
  2. 将文件内容读入列表,并根据需要在该列表上进行迭代。

代码中会发生什么?

在嵌套for循环的开始处,两个文件都打开并且可以读取。

只要第一个内部循环运行结束,searchfile就会结束。现在,当外循环处理第二个条目时,内循环就像一个空循环,因为它无法产生更多的条目。

答案 1 :(得分:5)

inwith关键字

您不需要两个嵌套的for循环! 而是像这样使用更具Pythonic性的in关键字:

with open("./search_file.txt", mode="r") as search_file:
    lines_to_search = search_file.readlines()

with open("./file_to_search.txt", mode="r") as file_to_search:
    for line_number, line in enumerate(file_to_search, start=1):
        if line in lines_to_search:
            print(f"Match at line {line_number}: {line}")

专业提示:使用with语句打开文件以自动将其关闭。

答案 2 :(得分:4)

每次searchfile迭代时,都需要将infile当前位置设置为开头。您可以为此使用seek函数。

searchfile = open('.\sometext.txt', 'r')
infile = open('.\somefile', 'r')

for line1 in infile:
    searchfile.seek(0,0)
    for line2 in searchfile:
        print line2

searchfile.close()
infile.close()

答案 3 :(得分:-1)

我们需要更多有关此代码中对象的详细信息。但是您可能想这样做:

    infile = open('.\somefile', 'r')

    for line1 in infile:
       for line2 in line1:
         print line2

    searchfile.close()
    infile.close()

如果infile是列表列表-在这种情况下,嵌套for循环就有意义。