循环一个字符串搜索,直到找到一个字符串python

时间:2011-02-01 01:14:16

标签: python string search file-io

我认为这很容易,经过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

3 个答案:

答案 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)