我认为这很容易,经过3个小时的搜索和反复试验后,这似乎并不容易。
我想要做的就是循环搜索字符串,直到找到字符串。我正在日志文件中搜索当出现条件时出现的字符串,例如当字符串"function test 1"
出现在日志中时我需要找到它然后执行另一个函数。
找到它没问题,问题是循环直到找到它。
这完全找到了:
for line in open(WebPath + SmokeTest): #these are variables I use to construct the path
if 'readfalseloop2' in line:
print True
f = open(WebPath + SmokeTest,'a')
f.write('<font color= "#347C2C">readfalseloop2</font><br />')
f.close()
break
else:
print False
我想执行此操作直到找到该单词。理想情况下,我想将它嵌入到多个函数中,我现在不想要单独的def。
我没有成功使用任何循环结构,是的,我查看了python文档,搜索了这个网站, ubuntu forum
答案 0 :(得分:4)
好的代码安德鲁。我没有被告知存在 for / else 的可能性。
但是为了缓和机器进程的活动,可以避免重复打开和关闭文件,并且最好冷却验证IMO的频率
from time import sleep
with open(WebPath + SmokeTest,'a+') as f:
while True:
if 'readfalseloop2' in f.read():
f.seek(0,1)
f.write('\n<font color= "#347C2C">readfalseloop2</font><br />')
print True
break
print '~',
f.seek(0,0)
sleep(2)
此代码有效,我测试了它。但只有通过另一个程序执行更改。当我尝试通过插入
来修改文件时<font color= "#347C2C">readfalseloop2</font><br />
手动链接,Windows拒绝关闭文件随着更改。
在 f.read()之后,必须重新激活文件的指针 f 才能编写
<font color= "#347C2C">readfalseloop2</font><br />
链接在文件内容的末尾。
我不知道这种重新激活是什么。我只知道如果没有执行 f.seek(0,1)指令,则进程无法从“读取”模式切换到“写入”模式。
f.seek(0,1)表示“从当前位置移动0个字符”;由于指针已经位于文件的末尾,所以给出另一个订单是没有用的,并且无论如何它会在文件结束之前回到开始写入以防它在其他地方:这是'a'模式特征。因此,即使指针在f.seek(0,0)的文件开头再次定位,写入也会在最后完成。
如果测试如果f.read()中的'readfalseloop2'给出 False ,则指针必须移动 f.seek(0,0) )到文件的最开头,以便新读取整个文件的内容。
警告:我不知道在文件是用utf-8编写的情况下会发生什么,因为在utf-8中,字符不是由相同的字节长度表示,而是取决于字符。在我看来,即使使用utf-8
它也应该正常工作
修改
我找到了更清晰,更短的代码:
from time import sleep
with open(WebPath + SmokeTest,'r+') as f:
while not 'readfalseloop2' in f.read():
print '~',
f.seek(0,0)
sleep(2)
f.seek(0,1)
f.write('\n<font color= "#347C2C">readfalseloop2</font><br />')
print 'True'
或
from time import sleep
with open(WebPath + SmokeTest,'r') as f, open(WebPath + SmokeTest,'a') as g:
while not 'readfalseloop2' in f.read():
print '~',
f.seek(0,0)
sleep(2)
g.write('\n<font color= "#347C2C">readfalseloop2</font><br />')
print 'True'
8行。 Python非常棒
答案 1 :(得分:1)
程序的问题在于读取输入文件并写入输出文件。因此,如果您找到所请求输入的单个实例,您的程序将进入无限循环,因为它将继续读取最后一行,将其重新附加到输出文件,即输入文件,然后重复。
我建议这样的程序:
import re
r = re.compile("readflaseloop2")
in_fn = WebPath + inputName
outf = open(in_fn + ".log","a")
count = 0
for line in open(in_fn):
m = r.search(line)
if m:
if count==0:
print True
outf.write("<font color='#347C2C'>%s</font><br>\n" % m.group(0))
outf.flush()
count += 1
if count==0:
print False
答案 2 :(得分:1)
正如vy32所说,写入你正在阅读的同一个文件可能很棘手(确切的行为与操作系统有关)。
目前还不完全清楚您正在阅读的文件是否由其他进程实时更新。我将假设情况就是这样,因为简单的线路迭代可以做到这一点。
当读取实时文件时,标准迭代器并不是你想要的,因为它会在遇到EOF标记时立即终止。要监视实时文件,您需要定期轮询它以获取新数据,或者设置一个特定于操作系统的通知机制,以便在新数据可用时通知您。
这个问题有一些很好的答案: How do I watch a file for changes?
回写到同一个文件仍然是一个潜在的问题,特别是如果另一个进程打开它进行编写(即使你获得了并发访问工作,让监视程序忽略也很棘手)它自己写入而不会有被监视的应用程序丢失写入的风险。)
使用带有collections.deque的文件行迭代器来记住上下文信息,同时仍然受益于行迭代器中内置的所有I / O优化的示例:
context = deque(maxlen=10) # Remember most recent 10 lines
for line in f:
# Process the current line
context.append(line)