Python搜索文件夹内所有源码中的关键字
起因:
收钱办事,帮协会论坛迁移的时候,因为历史遗留原因,可能是因为之前的前辈改了太多源码,导致除了数据库外有好多地方我找不到在哪改,论坛网站总是会跳转到之前用过的一个域名,我就在想能不能遍历文件夹里面的所有源码搜索那个旧域名。
读取文件夹内所有文件(包括子文件夹内的文件)
思路:我们只是想读出所有php文件的绝对路径,不需要知道什么文件夹之类的东西,所有我们直接使用os.walk()即可。
这里用到os库里面的os.walk()函数
我们查看Python Docs关于os.walk()的有 os — 多种操作系统接口 — Python 3.10.0 文档
os.
walk
(top, topdown=True, onerror=None, followlinks=False)
生成目录树中的文件名,方式是按上->下或下->上顺序浏览目录树。对于以 top 为根的目录树中的每个目录(包括 top 本身),它都会生成一个三元组 (dirpath, dirnames, filenames)
。
dirpath 是表示目录路径的字符串。 dirnames 是 dirpath 中子目录名称组成的列表 (excluding '.'
and '..'
)。 filenames 是 dirpath 中非目录文件名称组成的列表。 请注意列表中的名称不带路径部分。 要获取 dirpath 中文件或目录的完整路径(以 top 打头),请执行 os.path.join(dirpath, name)
。 列表是否排序取决于具体文件系统。 如果有文件或列表生成期间被移除或添加到 dirpath 目录中,是否要包括该文件的名称并没有规定。
如果可选参数 topdown 为 True
或未指定,则在所有子目录的三元组之前生成父目录的三元组(目录是自上而下生成的)。如果 topdown 为 False
,则在所有子目录的三元组生成之后再生成父目录的三元组(目录是自下而上生成的)。无论 topdown 为何值,在生成目录及其子目录的元组之前,都将检索全部子目录列表。
当 topdown 为 True
时,调用者可以就地修改 dirnames 列表(也许用到了 del
或切片),而 walk()
将仅仅递归到仍保留在 dirnames 中的子目录内。这可用于减少搜索、加入特定的访问顺序,甚至可在继续 walk()
之前告知 walk()
由调用者新建或重命名的目录的信息。当 topdown 为 False
时,修改 dirnames 对 walk 的行为没有影响,因为在自下而上模式中,dirnames 中的目录是在 dirpath 本身之前生成的。
默认将忽略 scandir()
调用中的错误。如果指定了可选参数 onerror,它应该是一个函数。出错时它会被调用,参数是一个 OSError
实例。它可以报告错误然后继续遍历,或者抛出异常然后中止遍历。注意,可以从异常对象的 filename
属性中获取出错的文件名。
walk()
默认不会递归进指向目录的符号链接。可以在支持符号链接的系统上将 followlinks 设置为 True
,以访问符号链接指向的目录。
注解
注意,如果链接指向自身的父目录,则将 followlinks 设置为 True
可能导致无限递归。walk()
不会记录它已经访问过的目录。
注解
如果传入的是相对路径,请不要在恢复 walk()
之间更改当前工作目录。walk()
不会更改当前目录,并假定其调用者也不会更改当前目录。
我们写出初步源码来来遍历文件夹并且输出看看
import os
dirloc = input('请输入搜索文件夹路径:')
for dirpath,dirnames,filenames in os.walk(dirloc):
for filename in filenames:
print(os.path.join(dirpath,filename))
那么现在证明了我们目前用的方式是没错的
读取每一个php文件,并且搜索关键字
思路:先判断后缀是不是php在再使用open()函数打开,打开后用readlines读取所有行,再读取每一行到line,在每个php文件的每一行中搜索关键字keyword
源码如下:
import os
dirloc = input('请输入搜索文件夹路径:')
keyword = input('请输入关键字:')
for dirpath,dirnames,filenames in os.walk(dirloc):
for filename in filenames:
if filename[-4:] == '.php':
phpfileloc = os.path.join(dirpath,filename)#php文件的绝对路径
with open(phpfileloc, 'r', encoding='gbk') as f:
lines = f.readlines()
for line in lines:
if keyword in line:
print('存在关键字于:', phpfileloc)
效果: