我正在编写的Python脚本的一部分要求我在大型文本或日志文件中查找特定的字符串:如果它存在,则执行某些操作;否则,执行其他操作。
送入的文件非常大(10GB+)。它使用起来非常慢,效率也很低:
with open('file.txt') as f:
for line in f:
if some_string in line:
return True
return False如果该字符串不存在于文件中,那么遍历将需要很长时间。
有没有一种省时的方法来实现这一点?
发布于 2021-02-06 08:37:13
您可以尝试使用mmap
>>> import mmap
>>> import re
>>> f = open("data.log", "r")
>>> mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
>>> re.search(b"test", mm)
<re.Match object; span=(12, 16), match=b'test'>发布于 2021-02-06 07:34:32
如果你使用的是Linux或BSD (Mac),我会使用grep或awk创建子进程并让它们进行搜索,它们已经对在大文件中查找字符串进行了数十年的优化。如果您只关心命令行是否存在,而不需要所有实例或计数,请确保包含命令行标志,以告诉它在第一个匹配后停止搜索。
发布于 2021-02-06 07:49:26
尝试处理更大的块,而不是单独的行。例如:
def contains(filename, some_string):
n = len(some_string)
prev_chunk = ''
with open(filename) as f:
while chunk := f.read(2 ** 20):
if some_string in prev_chunk[-(n-1):] + chunk:
return True
prev_chunk = chunk
return False我用一些1 GB的文件试了一下,它花了大约1秒的时间来检查不在其中的字符串。
https://stackoverflow.com/questions/66071560
复制相似问题