递归查找指定目录中含有指定关键字的文件

Windows不支持搜索.java、.c、.py、.tcl文件的内容。这里我实现一个函数find_files_by_suffix_and_content()递归查找指定目录中含有指定关键字的文件。可以根据文件后缀过滤文件。

#python3.6
#Windows不支持搜索.java、.c、.py、.tcl文件的内容。这里我实现一个函数find_files_by_suffix_and_content()递归查找指定目录中含有指定关键字的文件。可以根据文件后缀过滤文件。
import os

#查找指定目录中含有指定关键字的文件。可以根据文件后缀过滤文件,可以指定文件的编码格式。
def find_files_by_suffix_and_content(directory:str,key_words:str,suffix:str=".py",encoding:str='utf-8'):
    files=find_files_by_suffix(directory,suffix)
    return find_files_by_content(files,key_words,encoding=encoding)

def find_files_by_suffix(directory:str,suffix:str=".py"):
    'Get full pathes of all files with the suffix in this directory.'
    #os.walk() returns all directories, subdirectories and files recursively.
    file_number=0
    files=[]
    for dir_file in os.walk(directory):
        dirpath,dirnames,filenames=dir_file
        for filename in filenames:
            if(filename.endswith(suffix)):
                file_number+=1
                files.append(os.path.join(dirpath,filename))
    return files

def find_files_by_content(files:list,key_words:str,encoding:str='utf-8'):
    'Search key_words in the content of these files'
    match_file_number=0
    match_times=0
    match_files=[]
    for file in files:
        content=""
        with open(file,'r',encoding=encoding) as f:
            try:
                content=f.read()
            except Exception as e:
                pass
            time=content.count(key_words)
            if time>0:
                match_files.append(file)
                match_file_number+=1
                match_times+=time
    return match_files, match_times            

if __name__ == "__main__":
    directory=r"D:\Python36\Lib\site-packages\oscar" 
    match_files,match_times=find_files_by_suffix_and_content(directory,"ModelForm",suffix=".py",encoding='utf-8')
    print("match file number:",len(match_files))
    print("key_words occurs:",match_times)  
    for file in match_files:
        print(file)

输出为:

match file number: 20
key_words occurs: 46
D:\Python36\Lib\site-packages\oscar\apps\address\forms.py
D:\Python36\Lib\site-packages\oscar\apps\basket\forms.py
D:\Python36\Lib\site-packages\oscar\apps\basket\formsets.py
D:\Python36\Lib\site-packages\oscar\apps\basket\views.py
D:\Python36\Lib\site-packages\oscar\apps\catalogue\reviews\forms.py
D:\Python36\Lib\site-packages\oscar\apps\customer\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\catalogue\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\communications\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\offers\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\orders\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\pages\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\partners\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\ranges\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\reviews\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\shipping\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\users\forms.py
D:\Python36\Lib\site-packages\oscar\apps\dashboard\vouchers\forms.py
D:\Python36\Lib\site-packages\oscar\apps\payment\forms.py
D:\Python36\Lib\site-packages\oscar\apps\wishlists\forms.py
D:\Python36\Lib\site-packages\oscar\forms\mixins.py

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值