如何检查文件中是否存在行,如果使用Python不存在则将该行写入文件
这是我目前的尝试
logfile = open('ip.log', 'a+') while 1: line = logfile.readline() #line.replace("\n", "") print line if line == str(self.CLIENT_HOST): print "Line Found Skipping" else: logfile.write(str(self.CLIENT_HOST)+"\n") if not line: print "EOF Reached" break print line logfile.close()
欢呼声
答案 0 :(得分:9)
logfile = open('ip.log', 'r')
loglist = logfile.readlines()
logfile.close()
found = False
for line in loglist:
if str(self.CLIENT_HOST) in line:
print "Found it"
found = True
if not found:
logfile = open('ip.log', 'a')
logfile.write(str(self.CLIENT_HOST)+"\n")
logfile.close()
这是我的第一个快速解决方案。非常不洁净,但尚未成熟,但应该有效。
答案 1 :(得分:4)
要向日志文件追加客户端主机字符串(如果它尚不存在),您可以:
with open('ip.log', 'r+') as f:
for line in f:
if self.CLIENT_HOST in line:
break
else: # not found
print >>f, self.CLIENT_HOST
注意:else
语句的缩进不是错误。允许for
和while
循环具有else
子句是Python的一项功能。如果在循环内没有执行break
语句,则运行它。
答案 2 :(得分:4)
我认为这应该有效,并且它比任何其他答案更整洁,更健壮。如果没有,那么您可能需要打开另一个文件进行写入(第一个文件'r'
,第二个文件'a'
)。我也开始使用x.rstrip('\r\n')
和==
而不是in
来确保它是正确的。我不知道你的CLIENT_HOST
变量是什么。如果您的CLIENT_HOST
已经是str,请丢弃第一行并将其他行更改为直接引用它。
value = str(self.CLIENT_HOST)
with open('ip.log', 'a+') as f:
if not any(value == x.rstrip('\r\n') for x in f):
f.write(value + '\n')
答案 3 :(得分:2)
使用python过滤器:
file = open('ip.log', 'r')
flines = file.readlines()
res = filter(lambda x: self.CLIENT_HOST in x, flines)
if len(res) == 0:
file.write(str(self.CLIENT_HOST)+"\n")
file.close()
答案 4 :(得分:0)
将open('ip.log','a +')更改为open('ip.log','r'),然后再次写入文件或写入新文件。否则你只是使文件无限长。
答案 5 :(得分:0)
对行进行迭代可以让您在找到匹配项时停止加载文件,并防止您必须将整个文件保存在内存中。
def log_host(self):
host = str(self.CLIENT_HOST)
with open('ip.log', 'r+') as logfile:
for line in logfile:
if line.strip() == host:
return
# Move to the end of the file:
logfile.seek(0, 2)
logfile.write(host + "\n")
答案 6 :(得分:0)
可能是这样的
line="the line you are searching for"
logfile = open('ip.log', 'r')
loglist = logfile.readlines()
logfile.close()
if line not in loglist:
loglist.append(line)
new_logfile = open("pathToTheFile/logfile", 'w')
for lines in loglist:
new_logfile.write(lines)