我正在尝试打开文件并查找条目。如果条目/字符串存在/存在,则删除与该字符串关联的所有八行。然后在文件中添加一条新记录/条目。
现在我的代码只清除整个文件(清空文件)
我试图将fd.write部分更深地缩进到循环中并将其从循环中删除,我要么生成一个空文件,要么使用数百个条目填充该文件。
代码:
name = 'domain1'
with open("/usr/local/etc/list.db") as f, NamedTemporaryFile("w",dir=".", delete=False) as fd:
for line in f:
if name in line:
list(islice(f, 8))
fd.write("zone \""+name+"\" {\n")
fd.write(" type slave;\n")
fd.write(" masters {10.10.10.2;};\n")
fd.write(" allow-notify{10.10.10.2;};\n")
fd.write(" allow-transfer {trusted;};\n")
fd.write(" key-directory \"/usr/local/etc/namedb/\";\n")
fd.write(" file \"/usr/"+name+".signed\";\n")
fd.write("};")
move(fd.name,"/usr/local/etc/list.db")
print(fd)
fd.close()
脚本之前的文件内容:
zone "domain2.com" {
type slave;
masters {10.10.10.2;};
allow-notify{10.10.10.2;};
allow-transfer {trusted;};
key-directory "/usr/local/etc/namedb/";
file "/usr/domain.signed";
};
预期产出:
zone "domain1.com" {
type slave;
masters {10.10.10.2;};
allow-notify{10.10.10.2;};
allow-transfer {trusted;};
key-directory "/usr/local/etc/namedb/";
file "/usr/domain.signed";
};
zone "domain2.com" {
type slave;
masters {10.10.10.2;};
allow-notify{10.10.10.2;};
allow-transfer {trusted;};
key-directory "/usr/local/etc/namedb/";
file "/usr/domain.signed";
};
如何让我的python3代码更新文件而不清除它?
答案 0 :(得分:1)
当您在for循环中迭代f
时(在跳过不想要的行时),您需要将f
中的行写入文件。像这样:
with open("/usr/local/etc/namedb/tmp/zonelist.db") as f, NamedTemporaryFile("w",dir=".", delete=False) as fd:
skip = False
for line in f:
if name in line:
skip = True
if line.strip() == "};" and skip is True:
skip = False
continue
elif skip is True:
continue
fd.write(line)
fd.write("zone \""+name+"\" {\n")
fd.write(" type slave;\n")
fd.write(" masters {10.10.10.2;};\n")
fd.write(" allow-notify{10.10.10.2;};\n")
fd.write(" allow-transfer {trusted;};\n")
fd.write(" key-directory \"/usr/local/etc/namedb/\";\n")
fd.write(" file \"/usr/local/etc/signed\";\n")
fd.write("};\n")
move(fd.name,"/usr/local/etc/namedb/tmp/zonelist.db")
print(fd)
fd.close()
现在,您只是将新条目写入fd
,因此看起来所有旧条目都被“删除”(它们只是没有写入)。
那么for循环的作用是,如果它看到了名称(我假设是条目的第一行),它会将布尔标志设置为true,这将跳过所有行,直到我们看到“};”在一行上(你可以将它改为line.startswith("};")
如果它本身并不总是在一条线上),那么该标志将被设置回false。只要标志为false,它就会将f
的那一行写入临时文件。将f
的所有行写入/忽略到临时文件后,我们将移动到该文件的新条目。