<p>文件只是简单的文本流,因此它们不支持“如果不存在对等行,则追加此行”的任何概念;您必须手动构建它。在</p>
<p>你可以用一个纯文本文件来实现这一点,但它很笨重,而且可能效率低下。你要做的是通读文件并自己检查。您可以通过读取一次文件并将其存储在一个集合中而不是一次又一次地进行优化,但它仍然有点难看:</p>
<pre><code>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)
</code></pre>
<p>如果您想知道<code>set(outfile)</code>是如何工作的:Python中的file对象是一个iterable行。这就是<code>for line in infile:</code>起作用的原因。这意味着我们可以通过将iterable传递给<code>set</code>来构造一组所有的行。在</p>
<hr/>
<p>你最好有个数据库。在</p>
<p>最简单的数据库可能是Python内置的<code>dbm</code>格式,它的工作原理非常类似于Python dict。正如您不能在dict中多次存储同一个键(重复只是覆盖原始的),对于<code>dbm</code>也是如此。所以:</p>
^{pr2}$
<p>或者,更好的方法是使用键值ness。如果是<code>clients name</code>而不是整个字符串必须是唯一的,那么将该键设为该键,其余为值:</p>
<pre><code>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
</code></pre>
<p>当然,您的输出是<code>dbm</code>数据库,而不是文本文件,只有当消耗数据的对象知道如何使用<code>dbm</code>时,这种方法才有效。但如果你写的东西消耗你的数据,这应该不是问题。在</p>
<hr/>
<p>当然,每个键都有多个值要关联,因此理想的解决方案可能是多列键值数据库、文档数据库或关系数据库。Python附带了一个名为<code>sqlite3</code>的简单关系数据库,您可以使用类似这样的东西(未测试):</p>
<pre><code>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'))
</code></pre>