python3.4文件打开进程清除文件而不是更新文件

时间:2015-05-08 00:29:25

标签: python regex file

我正在尝试打开文件并查找条目。如果条目/字符串存在/存在,则删除与该字符串关联的所有八行。然后在文件中添加一条新记录/条目。

现在我的代码只清除整个文件(清空文件)

我试图将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代码更新文件而不清除它?

1 个答案:

答案 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的所有行写入/忽略到临时文件后,我们将移动到该文件的新条目。