经常会遇到一件事情就是:需要从很多文件中找到某个特定的历史文件。有些时候想找数据或者代码,发现忘记文件名称了,或者文件夹太多不想挨个的去翻,但是又隐约记得那个文件里包含什么数据,或者包含哪些代码语句。这时候只要按照文件内容搜索一下就好了。
代码中只需要修改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
"""
转自:“科研萌新”微信公众号
如有侵权,请联系本站删除!