基于列表查找字符串的有效方法

时间:2015-12-10 07:48:37

标签: python python-2.7

我是脚本新手,已经在Python上阅读了大约6周。以下内容旨在读取日志文件,并在找到<?php $host='localhost'; $username=''; $password=''; $database='reference'; mysql_connect($host, $username, $password)or die("cannot connect"); mysql_select_db($database)or die("cannot select DB"); $sql="SELECT * FROM TestTable"; $result=mysql_query($sql); ?> <table width="400" border="1" cellspacing="0" cellpadding="3"> <?php while($rows=mysql_fetch_array($result)){ echo ' <tr> <td width="30%">'.$rows['firstname'].'</td> <td width="30%">'.$rows['lastname'].'</td> <td width="30%">'.$rows['gender'].'</td> <td width="30%">'.$rows['console'].'</td> </tr>'; } ?> </table> <?php mysql_close(); require_once 'Connection.php'; ?> 中定义的关键字之一时发送警报。它按预期工作,并且不会像以前那样警告先前找到的字符串。但是,它的处理文件正由应用程序主动写入,并且脚本在500mb左右的文件上速度太慢。 200mb以下它工作正常,即20秒内。 有人会建议一种更有效的方法来根据预定义的列表在文件中搜索字符串吗?

srchstring

2 个答案:

答案 0 :(得分:1)

将搜索表达式重构为预编译的正则表达式可避免(显式)最内层循环。

import os, re
regex = re.compile(r'Shutdown|Disconnecting|Stopping Event Thread')

if os.path.isfile(r"\\server\\share\\logfile.txt"):
    #Indentation fixed as per comment
    with open(r"\\server\\share\\logfile.txt","r") as F:
       for line in F:
            if regex.search(line):
                # ...

答案 1 :(得分:0)

我在这里假设您使用的是Linux。如果不这样做,请在Windows上安装MinGW,以下解决方案也将适用。

只需将困难部分留给最有效的工具即可。在转到python脚本之前过滤数据。使用grep命令获取包含"Shutdown""Disconnecting""Stopping Event Thread"

的行
grep 'Shutdown\|Disconnecting\|"Stopping Event Thread"' /server/share/logfile.txt

并将这些行重定向到您的脚本

grep 'Shutdown\|Disconnecting\|"Stopping Event Thread"' /server/share/logfile.txt | python log.py

修改:Windows解决方案。您可以创建.bat文件以使其可执行。

findstr /c:"Shutdown" /c:"Disconnecting" /c:"Stopping Event Thread" \server\share\logfile.txt | python log.py

在'log.py'中,从stdin读取。它是类似文件的对象,所以这里没有困难:

import sys

for line in sys.stdin:
    print line,
    # do some slicing of string to get dd/mm/yy hh:mm:ss:ms
    # then create a marker file called file_dd/mm/yy hh:mm:ss:ms 
    # and so on

此解决方案将减少脚本必须完成的工作量。由于Python不是一种快速语言,它可能会加速任务。我怀疑它可以纯粹在bash中重写,它会更快(20多年的C程序优化不是你容易竞争的东西),但我不知道bash足够。