在文件中查找字符串的最快方法

时间:2016-05-06 18:18:44

标签: python python-2.7

我尝试了很多方法在文件中查找字符串,但都很慢。我只需要:

  • 在文件中查找字符串
  • 打印字符串
  • 的行

直到现在我一直在做的是读取文件(尝试了很多方法),然后检查我要查找的字符串是否位于当前行。如果没有,请检查下一行等。

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

以下内容适用于第一次出现的子串None。如果未找到匹配项,则会分配something;文件被懒惰地读到第一场比赛。

None

要查找所有匹配项,您可以使用列表推导:

with open('input.txt') as f:
    line = next((l for l in f if something in l), None)

我不知道你在纯python中是否能比这更快。

答案 1 :(得分:0)

我不知道你的速度目标,但这很快,因为它将大部分工作推迟到内置函数。

import string, re, sys

def find_re(fname, regexp):
    line_regexp ='^(.*%s.*)$' % regexp
    f = open(fname, 'r')
    txt = string.join(f.readlines())
    matches = re.findall(line_regexp, txt, re.MULTILINE)
    for m in matches:
        print(m)

def find_slow(fname, regexp):
    f = open(fname, 'r')
    r = re.compile(regexp)
    for li in f.readlines():
        if re.search(regexp, li):
            print(li),

“慢”版本可能就是您尝试过的版本。另一个find_re,大约快两倍(搜索27 MB文本文件时为0.7秒),但仍比grep慢20倍。

答案 2 :(得分:0)

我非常努力地使用itertools而不是普通的Python迭代来获得比Yakym更快的版本。最后它仍然较慢。也许有人可以想出一个更好的方法。

from itertools import imap, tee, compress, repeat
from time import time

target = 'Language Chooser'
path = '/Users/alexhall/Desktop/test.log'

start = time()

with open(path) as f:
    lines1 = [l for l in f if target in l]

print time() - start

# -----

start = time()

with open(path) as f:
    f1, f2 = tee(f)
    lines2 = list(compress(f1, imap(str.__contains__, f2, repeat(target))))

print time() - start

assert lines1 == lines2