抱歉,如果以前有人问过这个问题,但我似乎没有找到解决问题的方法。
我有大约 500 个文本文件,每个文件大小约为 5-6 kB。我需要搜索每个文件并检查其中是否存在特定关键字,并打印存在关键字的每个文件的详细信息。
我可以使用
for files in glob.glob("*"):
and then search for the keyword inside the file
我确信这不是最有效的方法。有什么更好的方法?
抱歉,如果以前有人问过这个问题,但我似乎没有找到解决问题的方法。
我有大约 500 个文本文件,每个文件大小约为 5-6 kB。我需要搜索每个文件并检查其中是否存在特定关键字,并打印存在关键字的每个文件的详细信息。
我可以使用
for files in glob.glob("*"):
and then search for the keyword inside the file
我确信这不是最有效的方法。有什么更好的方法?
如果您想要*.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 中”的输出,并且可以根据您认为合适的行来做一些聪明的事情。
grep 并不总是一种选择。如果您正在编写要在工作环境中使用的 python 脚本,并且该环境恰好主要是 Windows,那么当您告诉他们需要安装 grep 时,您就是在为您的团队进行依赖管理。那不好。
我没有找到比 glob 更快的搜索文件系统的方法,但是有一些方法可以加快搜索文件的速度。例如,如果您知道您的文件将有很多短行(例如 json 或 xml 文件),您可以跳过查看比您的最小关键字短的任何行。
python 中的正则表达式库也很慢。一次搜索每行一个字符以查看是否line[ len(str_to_search_for) : ] == str_to_search_for
比在每行上运行正则表达式要快一个数量级或更多。
最近我一直在文件系统上进行大量搜索,对于 500GB 的数据集,我的搜索开始于大约 8 小时,我设法使用这些简单的技术将它们降低到 3。这需要一些时间,因为您正在根据用例定制策略,但如果这样做,您可以从 python 中挤出很多速度。