经常会遇到一件事情就是:需要从很多文件中找到某个特定的历史文件。有些时候想找数据或者代码,发现忘记文件名称了,或者文件夹太多不想挨个的去翻,但是又隐约记得那个文件里包含什么数据,或者包含哪些代码语句。这时候只要按照文件内容搜索一下就好了。
代码中只需要修改search_word和search_path就行了。search_word:要搜索的关键词;search_path:文件所在文件夹,会遍历所有子文件夹。目前只是针对.py/.txt/.csv/.xml文件,感兴趣可以自行优化。
代码:
# -*- coding: utf-8 -*-
"""
@author: CZ
E-MAIL: CHINESEVOICE@163.COM
"""
import re
import os
def main(path=None,keyword = None):
    print(keyword)
    if keyword == None:
        raise "Input your word, please."
    if path == None:
        path = os.getcwd()
    for root, _, files in os.walk(path):
        for file in files:
            if file.endswith((".py",".txt",".csv",".xml")):
                searchnow = os.path.join(root,file)
                file = open(searchnow,"r",encoding="utf-8")
                # pattern = keyword
                # print(pattern)
                count = 0
                for items in file.readlines():
                    lst = re.findall(keyword, str(items))
                    if len(lst) > 0:
                        count += len(lst)
                if count != 0:
                    print(" "+searchnow)
                    print("  查到 "+str(count)+" 个 {}".format(keyword))
                file.close()
if __name__ == "__main__":
    #可使用正则表达式查找,具体使用方式参考文末
    search_word = r'coo.'
    search_path = "G:/Python_test"
    print("\n查找关键词为:{}\n".format(search_word))
    main(path=search_path,keyword=search_word)
    print("\n查找结束!")
    
#=================以下是正则表达式的符号含义,供参考,不影响上面代码运行========================
    """
    
    正则表达式符号含义:
    1. 基本符号
    .(英文句点) :通配符 - 用于表示任意字符
    
    \(反斜杠):转义字符 - 如 \. 就表示单纯的英文句点符号了
    
    [](中括号):字符集 - 表示里面的任意一个,如[abc],则匹配a,b,c中的任意一个。
    [pj]ython可以匹配python或jyson,注意并不能匹配pjython什么的。
    另外可以用[0-9]表示匹配任意一个数字,同理[a-z]或[A-Z]均合法。
    
    ^ :当放到字符集内的开头时表示为‘非’,如[^abc]表示匹配除abc之外的任意字符 
    
    ^ :匹配字符串开头
    
    $ :匹配字符串结尾(这两个实际中几乎用不到)
    
    2. 数量词
    *(星号):零个或多个,如a*可以匹配a, aa, aaa, ...也可以匹配为空
    
    +(加号):一个或多个,与上面类似,但不可匹配为空
    
    ?(问号):0个或一个。
    
    ?(问号):把数量词变为非贪婪模式,比如,用ab*匹配abababababacdefg,
    默认会匹配到ababababab,即尽量长的匹配到,但ab*?则只匹配一个ab回来。
    实际用途较多
    
    {m},重复m次,{m, n},重复m~n次
    
    3. 预定义字符集
    \d :匹配数字,等价于[0-9]
    
    \D :匹配任意非数字字符,等价于[^0123456789]
    
    \s :匹配空字符,如\t(tab)、\r\n(回车)、‘ ‘(空格)、\f\v(并不知是什么)
    
    \S :匹配任意非空字符,即等价于[^\t\r\n\f\v ]
    
    \w :匹配任意英文字符或数字,等价于[0-9a-zA-Z]
    
    \W :同理,和上面相反
  
    正则表达式符号参考来源:https://www.jianshu.com/p/b89979b4cd22
    """
转自:“科研萌新”微信公众号
如有侵权,请联系本站删除!