[英]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.