Python嵌套循环对于文件迭代只执行一次


#if(len(results) != 0)
fr = (open("new_file.txt","r"))
fr1 = (open("results.txt","w"))
    for j in range (len(line_list)):
        for i, line in enumerate(fr):
            if(i == line_list[j]):`find the line in the file`
                fr1.write(FAILURE_STRING+line)`mark the failure`
            else:`enter code here`
                fr1.write(line)
     fr.close()
     fr1.close()

在上面的例子中,mmyj循环只执行一次。我正试图在结果文件中标记失败。即使我的linelist几乎有7个元素(我想在不匹配的情况下用行号来标记失败(,它也只标记1个元素的失败。如果我在里面取J作为循环,它将标记所有的失败——结果文件中会有重复项(每行的重复项数量与line_list中的元素数量相同(

如果我理解正确,您有一个与文件(new_file.txt(上的行不匹配的行列表,并且您希望在这些行中引入一个错误字符串。为此,您必须在循环中使用fr.readlines(),这将产生类似于的结果

line_list = [0, 2, 2, 4]  # Example list of lines
FAILURE_STRING = "NO"
fr = open("new_file.txt", "r")
fr1 = open("results.txt", "w")
for i, line in enumerate(fr.readlines()):
    if(i == line_list[i]):
        fr1.write(FAILURE_STRING+line)
    else:
        fr1.write(line)
fr.close()
fr1.close()

open返回一个生成器,并且您只能对一个生成器进行一次迭代。

你有两个选择:

  1. 反转for循环,以便只对文件进行一次迭代。

    for i, line in enumerate(fr):
        for j in range (len(line_list)):
            if(i == line_list[j]): #find the line in the file
                fr1.write(FAILURE_STRING+line)#mark the failure`
            else:
                fr1.write(line)
    
  2. 将文件强制转换为非生成器类型

    fr = [i for i in fr]
    

感谢您的回答@NightShadeQueen你答案中的2分帮助我做到了。以下是行之有效的解决方案:

if(len(results) != 0):
     fr1 = (open("results.txt","w"))
     fr = (open("new_file.txt","r"))
     fr = [i for i in fr]
     for i in range (len(fr)):
         if i in line_list:
             fr1.write(FAILURE_STRING+fr[i])
         else:`enter code here`
             fr1.write(fr[i])            
 fr1.close()  

相关内容

  • 没有找到相关文章

最新更新