python编写查找函数_用python编写一个高效搜索代码工具

news/2024/7/7 15:20:17

大多码农在linux环境下使用grep+关键词的命令搜索自己想要的代码或者log文件。今天介绍用python如何编写一个更强大的搜索工具,windows下也适用。我们的需求:

1,可以同时指定多个关键词。比如某个文件某一行中有”error: aa bb cc”,如果检索关键词error和cc则可以显示该行,避免单一关键词冗余信息太多

2,可以排除某些关键词。对于”error: aa bb cc”,如果设定排除bb,则不予显示该行

3,可以指定某些文件名或者文件名后缀,如只搜索

.cpp和 .h的文件

4,可以排除某些文件名或者后缀,比如排除.log和.bak

5,最重要一点,和grep一样,必须能够递归查找,只要指定一个目录,则自动逐层搜索该目录下所有的子文件夹,文件

6,最后能打印出吻合的文件完整路径,能显示搜索到的行号

为了实现以上功能,我们需要用到python自带的os库函数,功能强大,先把用到的几个先做简单说明:

os.path.exists ( xxx )判断路径xxx是否存在

os.listdir ( xxx )把xxx路径下所有文件和文件夹名字转换成一个list列表

os.path.join ( aaa, bbb )把字符串aaa和bbb拼接成一个完整的文件绝对路径

os.path.isfile (xxx)判断xxx是不是一个文件

os.path.isdir (xxx)判断xxx是不是一个文件夹

以下是代码正文

# -*- coding: cp936 -*-

#代码准备工作

#由于需要获得文件的路径,所以要加载os和system库

import os

import sys

#设定两个检索关键词keyword

error和cc

keyword1 = 'error'

keyword2 = 'cc'

#设定一个排除的exclude_word

bb

exclude_word = 'bb'

#设定一组指定的文件名,使用list结构以便动态扩展

file_name_list = [ '.sv', '.v', '.cpp',

'.h']

#设定不参与检索的文件名,也使用list结构

exclude_file_name_list = [ '.bak ' ]

#指定一个search_path路径,把字符串留空,只初始化,为了实现在konsole界面实时捕捉当前路径

search_path = ' '

#准备工作完毕

#下面创建一个my_search函数,目的是为了实现递归查找子文件夹

#如果只需要查找当前目录层次的文件,则可以不使用函数

#传入参数为当前路径,为了实现递归查找子文件夹

def

my_search ( search_path ):

#防错机制,判断当前路径是否存在

if  os.path.exists( search_path )

:

#获得路径下所有文件文件夹的名字,并for循环遍历

for  my_filename  in

os.listdir ( search_path ):

#把当前路径和文件名拼接成完整绝对路径

full_filepath = os.path.join ( search_path,  my_filename )

#判断拼接出的完整路径是文件还是文件夹

if os.path.isfile (full_filepath):

#如果是文件,则对file_name_list中期望的文件名进行遍历

for my_extend in file_name_list

:

#判断.cpp

.sv等在文件名中

if my_extend in my_filename

:

flag = True

#对exclude_file_name_list中不希望的文件名进行遍历

for my_exclude in

exclude_file_name_list :

#若文件名有.bak就剔除

if my_exclude in

my_filename:

flag =  False

if flag: #文件名匹配已经命中

i = 0 #i作为文件行号

#逐行读取文件,碰到特大文件就不会卡死程序

for line in open (

full_filepath ) :

i=i+1 #每次读一行,i+1

#判断关键字1和2(error, cc)在该行中,并且exclude_word(bb)不在该行

if (keyword1

in line) and (keyword2 in line) and (exclude_word not in line):

#满足检索条件,打印文件完整路径,行号

print

full_filepath , 'line',i,':'

print line

#打印该行

#当前完整路径不是文件,而是文件夹

if os.path.isdir (full_filepath) :

#执行函数递归,继续到下一层文件夹目录查找,直到底层文件

my_search(full_filepath)

else : #防错机制,当前路径不存在,则报错

print search_path, 'path not exist!'

#这里相当于C语言主函数,程序从这里开始执行

search_path = os.getcwd () #从konsole获得当前路径,设为搜索路径

print search_path

my_search (search_path) #调用函数开始搜索


http://www.niftyadmin.cn/n/601371.html

相关文章

优化算法详解

文章目录1、机器学习要求解的数学模型2、最优化算法2.1 分类2.2 通用的优化框架3 公式解3.1 费马定理3.2 拉格朗日乘数法3.3 KKT条件4 数值优化算法4.1 梯度下降法4.1.1 SGD、BGD、MBGD随机梯度下降法4.1.2 动量项Momentum4.1.3 AdaGrad算法4.1.4 RMSProp4.1.5 AdaDelta算法4.1…

MySQL 中 SQL 语句的匹配策略

MySQL 中 SQL 语句的匹配策略&#xff1a;1. 一般的匹配&#xff1a; a. 标准SQL模式匹配 LIKE和NOT LIKE&#xff0c;以及_ 和% b. 正则表达式匹配 REGEXP和NOT REGEXP&#xff0c;以及很多功能强大地构造正则表达式 <!-- D(["mb","\u003c/span\>\u0…

Bootstrap 表格

2019独角兽企业重金招聘Python工程师标准>>> Bootstrap 提供了一个清晰的创建表格的布局。下表列出了 Bootstrap 支持的一些表格元素&#xff1a; 标签描述<table>容纳以表格形式显示数据的元素。<thead>表格标题行的容器元素&#xff08;<tr>&am…

基于kaggle欧洲国家太阳能发电数据集的太阳能站点效率预测

我们将只保留一个站点&#xff0c;使用 scikit-learn 的基本 ML 模型进行一个月的预测&#xff0c;使用深度学习和tensorflow预测一到两天。    性能指标&#xff1a;均方根误差&#xff0c;探索性分析可见&#xff0c;数据集是干净的&#xff1a;没有异常值&#xff0c;没有…

可缩放的思维导图_史上最全:高中英语“思维导图”汇总,基础语法全囊括,高分必备!高清可打印...

在英语学科的学习中&#xff0c;高中阶段的知识内容可以说是最为复杂的&#xff0c;不管是在单词词汇量的掌握积累&#xff0c;还是在对英语语法的学习掌握上&#xff0c;都是特别让同学们头疼的事情。尤其是在学业负担如此巨大的情况下&#xff0c;如果没有好的方法&#xff0…

Android: Avoid passing null as the view root

2019独角兽企业重金招聘Python工程师标准>>> 在做一个应用时把Android SDK从4.4换成6.0&#xff0c;使用LayoutInflater的inflate方法时出现以下情 LayoutInflater.inflate(int resource, ViewGroup root) 参数root为null时&#xff0c;出现warning提示 Avoid passi…

putty如何连接xlaunch_使用 Xming 和 PuTTY 配置 X11 转发

欢迎&#xff0c;来自IP地址为&#xff1a;180.116.57.251 的朋友通常情况下&#xff0c;Linux 服务器是不安装图形化界面的&#xff0c;这不仅出于资源优化的考虑&#xff0c;同时还提升了系统的安全性。但是有一些应用程序在安装时使用图形化界面&#xff0c;最典型的例子就是…

SQL Server 2005数据挖掘开发者指南

作者&#xff1a; Bogdan Crivat&#xff0c;微软公司时间&#xff1a;2005年3月适用于&#xff1a;微软 SQL Server 2005SQL Server 数据挖掘&#xff08;SQL Server Data Mining&#xff09;摘要&#xff1a;介绍SQL Server 2005数据挖掘的新API以及几种常用的开发场景。版权…