Python3在指定路径下递归定位文件中出现的字符串
[本文出自天外归云的博客园]
脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息)。
用到的python特性:
1. PEP 318 -- Decorators for Functions and Methods
2. PEP 380 -- Syntax for Delegating to a Subgenerator
3. PEP 471 -- os.scandir() function -- a better and faster directory iterator
4. PEP 498 -- Literal String Interpolation
代码如下:
import os
import sys __all__ = ['DirPath'] '''
在指定路径下递归查找包含指定字符串的文件
可以指定查找的文件类型category-默认为'.py'
可以指定查找的字符串str-默认为'python'
''' class DirPath(object):
# 初始化参数查找路径-path
def __init__(self, path):
self.show = self.show()
self.path = path # 开启func协程的装饰器
def on(func):
def wrapper(*args):
res = func(*args)
next(res)
return res return wrapper @on
# 搜索path路径下的python文件
def search(self, target, category):
while True:
path = yield
for entry in os.scandir(path):
if entry.is_file():
if entry.name.endswith(category):
target.send(entry.path)
if entry.is_dir():
self.search(target, category).send(entry.path) @on
# 找到f文件中包含str的行信息并发送给target
def find_str(self, target, str):
while True:
path = yield
with open(path, "r", encoding='utf-8') as f:
for (name, value) in enumerate(f):
if str in value:
target.send(f"[{path}][{name+1}]:{value}") @on
# 展示查询结果
def show(self):
while True:
res = yield
print(res) # 默认在'.py'类型文件中查找字符串-可以指定文件类型category
# 默认查找字符串'python'-可以指定查找字符串str
def code_search(self, category=".py", str="python"):
self.search(self.find_str(self.show, str), category).send(self.path) if __name__ == '__main__':
path = sys.argv[1]
Dir = DirPath(path)
Dir.code_search(str=sys.argv[2], category=sys.argv[3])
本地运行脚本,搜索结果示例如下:

Python3在指定路径下递归定位文件中出现的字符串的更多相关文章
- python之实现循环查看指定路径下的所有文件---os.walk
循环查看指定路径下的所有文件.文件夹,包含隐藏文件注:“.filename” 以点开头的是隐藏文件 import os for cur_path,cur_dirs,cur_files in os.wa ...
- Python小代码_15_遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间
遍历指定路径下的所有文件和文件夹,并格式化输出文件路径文件名和文件夹名,文件大小,修改时间 import osimport datetime def print_tree(dir_path): for ...
- Python —— 批量替换指定目录下的所有文件中指定字符串
参考:http://blog.csdn.net/zcwfengbingdongguke/article/details/13951527 代码: #!/usr/bin/python import os ...
- nodejs 获取指定路径下所有的文件夹名
示例:获取 ./components 下所有的文件夹名称 let components = [] const files = fs.readdirSync('./components') files. ...
- 封装的方法--读取任何路径下的properties文件中的值
概述:我们在做项目时,经常需要从某个properties文件中读取properties文件中的值.现在我封装了一下方法,直接读取配置文件中的值. 代码如下所示: /** * Created by qi ...
- linux下使用grep在当前目录下搜索所有文件中含有的字符串
grep -r yourstr ./ 举例: grep -r sprintf ./ (在当前目录下递归查找含有字符串sprintf的文件)
- Linux系统下,在文件中查找某个字符串
在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车. Vim会跳转到第一个匹配.按下n查找下一个,按下N查找上一个. Vim查找支持正则表达式,例如/vim$匹配行尾的" ...
- 【Lua】关于遍历指定路径下所有目录及文件
关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...
- java通过文件路径读取该路径下的所有文件并将其放入list中
java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...
随机推荐
- apache安装mod_ssl.so 出现 undefined symbol: ssl_cmd_SSLPassPhraseDialog错误解决
很久很久以前,安装Apache的时候,根本没想过将来的某一天会使用到ssl,所以也就没有安装那个模块,结果今天需要用到的时候,却无从下手了. 由于在安装Apache的时候,mod_ssl.so这个文件 ...
- java 实现唯一ID生成器
2014-11-08 内容存档在evernote,笔记名"java 实现唯一ID生成器"
- 如何用STAF进行自动化测试分布式运行
本文的目的在于引导读者去了解STAF及如何调用其接口去实现自动化测试的分布式动行. 提到分布式运行,很多人想到了Jenkins,Jenkins里面有个node插件,可以去分派任务给slave,Jenk ...
- 进阶之路(基础篇) - 010 Arduino 函数(基本、串口、SPI)
一.基本函数 pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认低电平(或浮空) digitalRead(数字输入端口号); analogRe ...
- string与char*的转换方法
c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程. c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言 ...
- 记录:js删除数组中某一项或几项的几种方法(转)
1:js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- React Native工程修改Android包名
默认初始化的React Native工程,生成Android工程的时候,包名默认是React Native工程的名字,跟一般Android工程com.company.xxx不一样. 这时候就需要手动修 ...
- Android Studio开发-高效插件强烈推荐
Android Studio开发-高效插件强烈推荐 现在Android的开发者基本上都使用Android Studio进行开发(如果你还在使用eclipse那也行,毕竟你乐意怎么样都行).使用好And ...
- mysql group replication 主节点宕机恢复
一.mysql group replication 生来就要面对两个问题: 一.主节点宕机如何恢复. 二.多数节点离线的情况下.余下节点如何继续承载业务. 在这里我们只讨论第一个问题.也就是说当主结点 ...