在python 3.x中有效地搜索多个文件关键字的最佳方法



对不起,如果之前有人问过这个问题,但我似乎没有找到解决问题的方法。

我有大约 500 个文本文件,每个文件的大小约为 5-6 kB。我需要搜索每个文件并检查其中是否存在特定关键字,并打印存在该关键字的每个文件的详细信息。

我可以使用

for files in glob.glob("*"):
      and then search for the keyword inside the file

我敢肯定这不是最有效的方法。还有什么更好的方法?

如果你想在你的目录中包含stdio.h文件的所有*.c文件,你可以这样做

grep "stdio.h" *.c

(注意 - 为回应@Wooble的评论而编辑。

结果可能如下所示

myfile.c: #include <stdio.h>
thatFile.c: #include <stdio.h>

等。

如果您想查看"上下文"(例如前后行(,请使用 C 标志:

grep -C1 "(void)" *.c

结果:

scanline.c-
scanline.c:int main(void){
scanline.c-  double sum=0;
--
tour.c-
tour.c:int main(void) {
tour.c-int *bitMap;

等。

我认为这对你来说应该很有效。

再次,解决@Wooble的另一点:如果你真的想用Python做到这一点,你可以使用

import subprocess
p = subprocess.Popen('grep stdio *.c', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print line,
retval = p.wait()

现在,您可以访问"在 Python 中"的输出,并且可以根据需要对这些行做一些聪明的事情。

grep并不总是一个选项。如果您正在编写要在工作环境中使用的 python 脚本,并且该环境恰好主要是 Windows,那么当您告诉团队他们需要安装 grep 时,您正在咬掉团队的依赖关系管理。那可不行。

我没有找到比 glob 更快的搜索文件系统的方法,但是有一些方法可以加快搜索文件的速度。例如,如果您知道您的文件将包含大量短行(例如 json 或 xml 文件(,则可以跳过查看任何短于最小关键字的行。

Python 中的正则表达式库也非常慢。它要快得多,按量级或更多,一次搜索一个字符,以查看是否line[ len(str_to_search_for) : ] == str_to_search_for而不是在每行上运行正则表达式。

我最近一直在文件系统上进行相当多的搜索,对于 500GB 的数据集,我的搜索从大约 8 小时开始,我设法使用这样的简单技术将它们减少到 3 小时。这需要一些时间,因为您正在根据用例定制策略,但是如果您这样做,则可以从python中挤出很多速度。

最新更新