繁体   English   中英

如果已经存在,请不要追加

[英]Do not append if it already exists

我有一个名为ClientList.txt文件,其输出为:

client1.hello.com
client2.hello.com
client3.hello.com

我使用此脚本将ClientList.txt的值附加到output.txt文件中。 码:

with open("ClientList.txt", "r") as infile:
  with open("output.txt", "a") as outfile:
    for line in infile:
        outfile.write("".join(["clients name: ",line.strip(), ", clients URL: ", line.strip(), ", service: VIP\n"]))

输出:

clients name: client1.hello.com, clients URL: client1.hello.com, service: VIP
clients name: client2.hello.com, clients URL: client2.hello.com, service: VIP
clients name: client3.hello.com, clients URL: client3.hello.com, service: VIP

问题:将来我想用新客户端(例如: client4.hello.com等)更新ClientList.txt 如果output.txt文件中已经存在该值,是否可以不附加该值?

文件只是简单的文本流,因此它们不支持“如果不存在等效行,则追加此行”的任何概念; 您必须手动构建。

可以仅使用纯文本文件执行此操作,但是它笨拙且效率低下。 您要做的就是通读文件并检查一下自己。 您可以通过一次读取文件并将其存储在集合中来进行优化,而不是一遍又一遍地进行操作,但这仍然有些丑陋:

with open("ClientList.txt", "r") as infile:
    with open("output.txt", "r") as outfile:
        existing = set(outfile)
    with open("output.txt", "a") as outfile:
        for line in infile:
            outline = "".join(["clients name: ",line.strip(), ", clients URL: ", line.strip(), ", service: VIP\n"])
            if outline not in existing:
                outfile.write(outline)
                existing.add(outline)

如果您想知道set(outfile)工作方式:Python中的文件对象是一行可迭代的行。 这就是为什么for line in infile:有效。 这意味着我们只需传递可迭代的set就可以构造所有行的set


使用数据库可能会更好。

最简单的数据库可能是Python内置的dbm格式,其工作原理与Python dict非常相似。 正如您无法在dict中多次存储相同的密钥(重复操作只会覆盖原始密钥)一样, dbm也是如此。 所以:

with open("ClientList.txt", "r") as infile:
    with dbm.open("output.dbm", "c") as outfile:
        for line in infile:
            outline = "".join(["clients name: ",line.strip(), ", clients URL: ", line.strip(), ", service: VIP\n"])
            outfile[outline] = ""

或者,更好的方法是实际使用键值性。 如果是clients name而不是必须唯一的整个字符串,请将该键设置为其余键,其余为值:

with open("ClientList.txt", "r") as infile:
    with dbm.open("output.dbm", "c") as outfile:
        for line in infile:
            outline = json.dumps({
                "clients name": line.strip(),
                "clients URL": line.strip(),
                "service": "VIP"})
            outfile[clients_name] = outline

然后,当然,您的输出是dbm数据库而不是文本文件,仅当消耗数据的事物知道如何使用dbm ,该文件才起作用。 但是,如果您正在编写消耗数据的东西,那应该不是问题。


当然,您有多个与每个键关联的值,因此理想的解决方案可能是多列键值数据库,文档数据库或关系数据库。 Python附带了一个简单的关系数据库,称为sqlite3 ,您可以使用以下代码(未经测试):

with open("ClientList.txt", "r") as infile:
    db = sqlite3.connect('output.sqlite')
    db.execute('''CREATE TABLE IF NOT EXISTS Clients COLUMNS (
        Name TEXT PRIMARY KEY,
        URL TEXT,
        Service TEXT)''')
    for line in infile:
        db.execute('''INSERT OR IGNORE INTO Clients (Name, URL, Service)
            VALUES (?, ?, ?)''', (line.strip(), line.strip(), 'VIP'))

只要文件大小不是太大,我就会采用simplestest解决方案,然后将数据读入内存,对其进行更改,然后将其写回。 这在python中非常简单,而且仍然很快。

with open('ClientList.txt') as f:
    data = set(f.readlines())
data.add('nextValue\n')
with open('ClientList.txt', 'w') as f:
    f.writelines(data)

您可以添加如下验证:def exist(file_name,link):将open(file_name)作为tmp:tmp中的行:if link in line:return True return False

使用open(“ ClientList.txt”,“ r”)作为infile:使用open(“ output.txt”,“ a”)作为outfile:用于infile中的行:如果不存在('output.txt',line): outfile.write(“”。join([“客户端名称:”,line.strip(),“,客户端URL:”,line.strip(),“,服务:VIP \\ n”]))`甚至关闭并关闭每次打开文件可能都不是一个好主意,您可以修改函数以维护对文件的引用,而只需要在开始时移动指针并再次开始搜索,您也可以内存中的内容并直接在其中执行搜索,但这将由您决定

当然,您可以只检查客户端名称是否在output.txt中,例如:

with open("ClientList.txt", "r") as infile:
  with open("output.txt", "a") as outfile:
    file=outfile.read()
    for line in infile:
        clientName=line.strip()
        if (clientName in file)==False:
            outfile.write("".join(["clients name: ",line.strip(), ", clients URL: ", line.strip(), ", service: VIP\n"]))

不确定是否可以,但是应该可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM