目录

目录遍历

文件名搜索

文件内容搜索

关键字搜索整合

完整代码


目录遍历

首先我们来看如何实现目录遍历

目录遍历的过程很简单:

  1. 将目标路径作为当前目录
  2. 罗列出当前目录下的所有内容
  3. 判断每一个目标是否是文件夹。
  4. 如果是,进入该文件夹搜索(将文件夹路径改为当前路径,多级目录在此处会循环)

为什么我们要使用递归,与for对已知大小的列表的遍历相比,递归更适合与那些确定开始结束条件而过程不确定的情况。我们将初始路径设为起点,将目录下没有其他目录可以进入的情况设为终点

让我们来看如何通过递归的方式来遍历某个路径下的所有内容

def search(path):content = os.listdir(path)for each in content:each_path = path + os.sep + eachif os.path.isdir(each_path):search(each_path)print(each_path)#测试输出
  • 第1行:首先我们先定义一个search函数,参数path是接收的路径
  • 第2行:os.listdir(path) 将path路径下的所有(文件/文件夹)作为一个列表返回
  • 第3行:使用for循环遍历当前目录
  • 第4行:构建当前目录下文件的完整目录(当前目录/文件名称),os.sep为当前操作系统的分隔符
  • 第5行:判断这个目标是否是文件夹
  • 第6行:如果是,把这个文件夹作为新的路径像刚才那样再来一遍
  • 第7行:最后在循环的后面我们加一个print来看看输出了什么

来看我们的测试目录test的结构

test
├── a
│   ├── a
│   ├── b
│   └── c
│       └── file.md
├── b
│   ├── a
│   └── b
│       └── target.py
├── c
│   └── a
└── d

测试,进入test目录并使用os.getcwd()返回当前路径:

>>> search(os.getcwd())

输出结果

/home/Jkob/Github/test/b/b/target.py
/home/Jkob/Github/test/b/b
/home/Jkob/Github/test/b/a
/home/Jkob/Github/test/b
/home/Jkob/Github/test/a/b
/home/Jkob/Github/test/a/a
/home/Jkob/Github/test/a/c/file.md
/home/Jkob/Github/test/a/c
/home/Jkob/Github/test/a
/home/Jkob/Github/test/d
/home/Jkob/Github/test/c/a
/home/Jkob/Github/test/c

目录的遍历有什么用呢,我们可以添加条件来(搜索/操作)目录下所有符合条件的文件

文件名搜索

我们来对刚刚的函数进行简单的修改

def search(path,keyword):content= os.listdir(path)for each in content:each_path = path+os.sep+eachif filename in each:print(each_path)if os.path.isdir(each_path):search(each_path,keyword)

与刚刚不同的只有简单几行

  • 第1行:函数参数增加了要搜索的文件名
  • 第5,6行:增加了判断,我们这里使用‘in’ 而不是‘==’ 的目的是为了使用模糊匹配,只要包含搜索的关键字就符合条件
    -第8行:由于我们整个函数没有修改filename,所以我们可以将搜索条件传递下去

我们这次再来测试,寻找藏起来的target.py

>>>search(os.getcwd(),'target')

结果

/home/Jkob/Github/test/b/b/target.py

再试一次

>>>search(os.getcwd(),'tar')

结果

/home/Jkob/Github/test/b/b/target.py

文件内容搜索

然而只有文件名字符合并不能满足我们的需求,我们有时也需要查找文件里面的内容是否符合关键字需求

def content_search(filepath,keyword):f = open(filepath,'r')for line in f:if keyword in line:f.close()return Truef.close()return False

在这里我们定义了一个函数content_search(),搜索文件内容并默认返回False,如果符合关键字条件即返回True并终端该项搜索

别忘记关闭文件哦

接下来我们将这个函数整合到我们刚刚的文件搜索函数中

关键字搜索整合

我们来把刚才的内容搜索函数添加到我们刚才的搜索函数中

def search(path,keyword):content= os.listdir(path)for each in content:each_path = path+os.sep+eachif keyword in each:print(each_path)if os.path.isdir(each_path):search(each_path,keyword)elif content_search(each_path,keyword):print(each_path)

我们只添加了最后两行,即当该文件包含关键字时,我们显示该文件路径。但是为什么我们不能把这个和刚才文件名判定条件放在一起呢?因为有的文件名指代的是文件夹,我们需要将其放在文件夹判断之后

我们来测试一下,其实目录下的file.md文件是编辑过的,内容为’target’:

search(os.getcwd(),'tar')

返回

/home/Jkob/Github/test/b/b/target.py
/home/Jkob/Github/test/a/c/file.md

如果我们将整个文件作为工具的话,我们可以最后一行添加

search(os.getcwd(),input('Your Keyword:'))

完整代码

import os
def search(path,keyword):content= os.listdir(path)for each in content:each_path = path+os.sep+eachif keyword in each:print(each_path)if os.path.isdir(each_path):search(each_path,keyword)elif content_search(each_path,keyword):print(each_path)
def content_search(filepath,keyword):f = open(filepath,'r')for line in f:if keyword in line:f.close()return Truef.close()return False
search(os.getcwd(),input('Your Keyword:'))

示例:

[Jkob@localhost test] $ python3 test.py
Your Keyword:tar
/home/Jkob/Github/test/b/b/target.py
/home/Jkob/Github/test/a/c/file.md

python3 文件内容搜索 文件名搜索 目录遍历相关推荐

  1. python查找文件内容_python实现搜索文本文件内容脚本

    本文介绍用python实现的搜索本地文本文件内容的小程序.从而学习Python I/O方面的知识.代码如下: import os #根据文件扩展名判断文件类型 def endWith(s,*endst ...

  2. 怎么搜索php文件内容,linux怎么搜索文件

    使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索.搜索文件的命令为"find":"locate":"whereis& ...

  3. linux根据文件内容查找文件名,文件查找:find命令,文件名后缀

    首先说下一些在命令窗口常用的快捷键: Ctrl+L 清屏 Ctrl+C 结束当前命令 Ctrl+A 光标移到行首 Ctrl+E 光标移到行尾 Ctrl+U 删除光标前内容 Ctrl+D 退出当前终端, ...

  4. linux目录下所有文件内容替换,linux替换目录下所有文件中的某字符串

    比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做: sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl ...

  5. php post 漏洞_文件包含上传漏洞目录遍历命令执行漏洞

    制丨阿星 来源丨freebuff 作者丨Deutsh 文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create ...

  6. Python批量打开文件以及获取文件名、目录及路径

    一. #定义函数,用于打开指定类型文件的函数 def open_allfile(path,filetype): data=[] import glob import os read_files=glo ...

  7. linux 批量替换文件内容及查找某目录下所有包含某字符串的文件(批量修改文件内容)

    转自 http://blog.csdn.net/werm520/article/details/49334513 grep -rl '10.100.137.5' | xargs sed -i '10. ...

  8. linux 批量替换文件内容及查找某目录下所有包含某字符串的文件(批量修改文件内容)...

    1. sed grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g' 例如: 对象:文件夹 grep -rl 'windo ...

  9. Linux下批量替换文件内容和文件名(转)

    1.批量替换指定多个文件的文件内容 在指定目录/your/path里,查找包含old_string字符串的所有文件,并用new_string字符串替换old_string字符串. sed -i &qu ...

最新文章

  1. 服务器的文件共享,服务器文件共享设置
  2. 通过命令删除在ambari界面上无法删除节点上服务
  3. Vue中进行断点调试的两种方式(使用外部浏览器和VsCode的 Debug for Chrome插件)
  4. 读书笔记_C#入门经典(第5版)第六章_函数
  5. cd rw 多少次_程序员:想知道你每天按了多少次键盘吗?
  6. Aerodynamic CodeForces - 1300D(计算几何判断是否为中心对称图形)
  7. Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)
  8. RazorExtensions Templated Razor Delegates
  9. 清明节特辑 |记忆存储、声音还原、性格模仿……AI可以让人类永生吗?
  10. php loadclass,Laravel如何实现自动加载类
  11. 漂泊在汉语视界中的蒙古歌者
  12. 跑步听歌用什么耳机好?适合跑步专用的耳机推荐
  13. javascript实现汉诺塔
  14. 全球重力场模型数据下载
  15. 私募基金电子合同快来了!《私募投资基金电子合同业务管理办法(试行)(征求意见稿)》发布
  16. 【Splay】[SGU 187]Twist and whirl - want to cheat
  17. 招银网络:笔试题(20190906)
  18. 直播系统源码,直播软件开发过程
  19. OSA期刊投稿记录---applied optics
  20. 朋友去华为面试,轻松拿到30K的Offer,羡慕了......

热门文章

  1. WinAPI: CreateDirectoryEx - 根据模版建立文件夹
  2. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — iptables NAPT 网络地址/端口转换
  3. 分布式系统架构设计系列文章
  4. Openstack组件实现原理 — Nova 体系结构
  5. NR 5G RLC无线链路控制
  6. python-简单测试wsgi
  7. 设置CodeRush Xpress的线条颜色
  8. shape(15,)与(15,1)的区别
  9. Sublime如何设置背景透明
  10. MapReduce源码之InputFormat