0

抱歉,如果以前有人问过这个问题,但我似乎没有找到解决问题的方法。

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

我可以使用

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

我确信这不是最有效的方法。有什么更好的方法?

4

2 回答 2

0

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

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 中”的输出,并且可以根据您认为合适的行来做一些聪明的事情。

于 2013-10-08T14:25:30.480 回答
0

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

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

python 中的正则表达式库也很慢。一次搜索每行一个字符以查看是否line[ len(str_to_search_for) : ] == str_to_search_for比在每行上运行正则表达式要快一个数量级或更多。

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

于 2020-01-14T05:13:29.243 回答