#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
返回一个生成器,并且您只能对一个生成器进行一次迭代。
你有两个选择:
-
反转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)
-
将文件强制转换为非生成器类型
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()