我尝试了很多方法在文件中查找字符串,但都很慢。我只需要:
直到现在我一直在做的是读取文件(尝试了很多方法),然后检查我要查找的字符串是否位于当前行。如果没有,请检查下一行等。
这样做的最佳方式是什么?
答案 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