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

2024-07-08 07:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

输出:

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

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


Tags: 文件nametxt脚本comurlhellooutput
3条回答

只要文件大小不是太大,我会使用最简单的解决方案,只需将数据读入内存,更改它,然后将其写回。这在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(文件名,链接): 打开(文件名)为tmp: 对于tmp中的线路: 如果链接成直线: 返回True 返回False

打开(“客户列表.txt“,”r“)作为填充: 打开(“输出.txt“,”a“)作为输出文件: 对于内嵌线: 如果不存在('输出.txt'行): 输出文件.写入(“”.join([“客户端名称:”,线条条(),“,客户端URL:”,线条条(),“,服务:VIP\n“])) ` 即使每次都关闭和打开文件也不是一个好主意,您可以修改函数,使您保持对文件的引用,您只需在开始处移动指针并再次开始搜索,您也可以在内存中保存所有内容并直接在那里执行搜索,但这项工作将由你决定

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

你可以用一个纯文本文件来实现这一点,但它很笨重,而且可能效率低下。你要做的是通读文件并自己检查。您可以通过读取一次文件并将其存储在一个集合中而不是一次又一次地进行优化,但它仍然有点难看:

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中的file对象是一个iterable行。这就是for line in infile:起作用的原因。这意味着我们可以通过将iterable传递给set来构造一组所有的行。在


你最好有个数据库。在

最简单的数据库可能是Python内置的dbm格式,它的工作原理非常类似于Python dict。正如您不能在dict中多次存储同一个键(重复只是覆盖原始的),对于dbm也是如此。所以:

^{pr2}$

或者,更好的方法是使用键值ness。如果是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'))

相关问题 更多 >

    热门问题