[转载] Python递归遍历目录下所有文件查找指定文件
参考链接: Python目录和文件管理
之前看到网上有人说『os.path.isdir()判断必须写绝对路径』,当时心想Python不是有迭代上下文吗,为什么不行?遂作本文验证之
代码部分
考虑用一个path变量指代当前遍历元素的绝对路径(正确做法)
def search(root, target):
items = os.listdir(root)
for item in items:
path = os.path.join(root, item)
if os.path.isdir(path):
print('[-]', path)
search(path, target)
elif path.split('/')[-1] == target:
print('[+]', path)
else:
print('[!]', path)
正常遍历的结果
如果这样写,把路径全部换成item(迭代元素)
def search(root, target):
items = os.listdir(root)
for item in items:
if os.path.isdir(item):
print('[-]', item)
search(os.path.join(root, item), target)
elif item == target:
print('[+]', os.path.join(root,item))
else:
print('[!]', os.path.join(root, item))
可以看出,这是行不通的:如果使用item迭代元素进行指代当前路径,最多只会再往下递归两层(子文件夹、子文件夹的文件),可见所未的上下文管理机制在这里是完全不起作用的
反思和总结
1)如果在正确遍历写法基础上,仅改变每次递归时的传递元素迭代机制会做出怎样的反应?
在上面的例子中,只需要把search(os.path.join(root, item), target)改成search(item, target)即可:
这一点很容易看出,因为在首次调用search(..)函数时就是传入了一个绝对路径,如果传入相对路径因为没有上下文环境,是不能正确定位文件位置的
2)os.path.abspath(path)方法可以替代os.path.join(root, current)吗?
实践出真知:
(大雾)原来os.path.abspath(..)表示的是:相对当前工作目录的相对路径!(而不是相对系统根目录的相对路径!)
所以,os.path.abspath(..)和os.path.join(..)是两个完全不同的东西,是不能替换的
3)Python的文件到底是什么呢?
还是那份正确的代码,将每一条输出改成用type(..)函数包裹的形式
在看下面另一个例子
本着Python中『一切皆对象』的信念,我们输入的路径(包括它的迭代版本、用来接受它的变量)是一个字符串str对象,而用来描述文件的文件句柄(指针)则是一个_io.TextIOWrapper类型的对象
通常我们在文件夹、文件水平查找、筛选,用的是str类型的路径描述,而要对具体某个文件(不是文件夹)进行读或写的操作,就要用到_io.TextIOWrapper类型的文件句柄,它们分的比较细;不像Java中完全被封装成了一个File(String path)对象,它弱化了文件路径的作为单独个体的作用——但是Python则把路径单独拎出来,我们很多的文件操作(广义上比如查找指定文件,不单指文件IO),都是建立在文件路径的基础上的
4)思考:除了开头给出的方法,有没有别的遍历文件办法?
答案是:有的(yes)
os.chdir(path)函数可以改变当前工作目录到指定path
但是我们不推荐使用该方法,因为它修改了全局变量,这一点在函数调用前后使用os.getcwd()函数进行验证
先把工作目录切换到根目录下,接着执行自定义的change()函数
如你所见,这时候全局的当前工作目录已经发生了改变
[转载] Python递归遍历目录下所有文件查找指定文件相关推荐
- VC/MFC 下 递归遍历目录下的所有子目录及文件
在MFC下要实现文件夹的递归遍历,可用CFileFind类,依次读取文件夹下的子文件夹和文件,并判断通过判断是文件夹还是文件来决定递归遍历.递归遍历代码如下: /******************* ...
- linux sed 目录递归,shell递归遍历目录下的所有文件并统一改名的方法-文件更名...
对Linux开发技术感兴趣或者是从事Linux开发技术的小伙伴是否知道如何把某个目录下的每个文件统一在名字前加上"abc",用shell实现呢?下面就随Linux培训小编来了解一下 ...
- java 递归 遍历目录下的所有文件
public class Demo{static int level;public static void main(String[] args) throws IOException {//利用递归 ...
- 递归 遍历目录下的所有文件
public class Demo{static int level;public static void main(String[] args) throws IOException {//利用递归 ...
- python递归遍历目录_Python实现递归遍历文件夹并删除文件
思路: 遍历文件夹下面的文件夹 如果文件夹名称等于".svn",则修改文件夹的属性(因为".svn"的文件都是只读的,你不能直接删除) 删除此文件夹 如果文件夹 ...
- python遍历目录下所有文件_Python递归遍历目录下所有文件
#自定义函数: importos path="D:\\Temp_del\\a" defgci (path):"""this is a statemen ...
- Python Tricks(九)—— 递归遍历目录下所有文件
递归的一大应用场景便在于不知其层数. import os def list_filename(path):for d in os.listdir(path):d = path + '/' + d # ...
- windows系统下递归遍历目录下的所有文件
c++代码如下: int GetAllFilepathFromfolder(char* Path) {char szFind[MAX_PATH];WIN32_FIND_DATA FindFileDat ...
- Python遍历目录下的文件(os.walk 、os.listdir的用法)
Python遍历目录下的文件(os.walk .os.listdir的用法) 最近想从一个目录转移一些文件到另外一个目录,因为文件有指定的后缀,所以想着用python来转移,不做cv工程师,那就涉及到 ...
最新文章
- AI生成的代码你敢用吗?有人给最近走红的Copilot做了个“风险评估”
- MEET大会报名开启 | 李开复张亚勤等产学研大咖邀你共同见证智能未来
- codevs1040 统计单词个数
- Linux编辑firmware的文件,Linux中request_firmware 的用法
- onmounted vue3_Vue3.x 生命周期 和 Composition API 核心语法理解
- 4-1.最大子数组分治法实现
- html提示版本过低升级,IE8浏览器提示版本过低怎样升级呢?
- Jmeter小程序压力测试案例
- 移动通信网络规划:多址技术
- 炫酷canvas网页背景动画效果
- Office Online Server 2016 安装部署笔记
- LR(1)分析法的总控的实现(C++实现)
- 第一篇 香橙派刷机和开发环境准备(Armbian版)
- OSS简单上传下载整理
- 派森编程python_派森学python
- 内网环境下微信扫码登录小结
- 2月海外域名主机商TOP10:Godaddy居首 雅虎第7
- rundll32.exe和regsvr32.exe
- dp训练计划——poj3666(离散化+滚动数组优化)
- 在Java中声明一个unsigned int
热门文章
- PL/SQL生成表的数据结构关系图
- 2021牛客暑期多校训练营4,签到题CFIJ
- bootstrap获取弹框数据_execl基础-分类汇总与数据有效性验证
- python科学计算库-python 科学计算基础库安装
- JavaScript浏览器对象模型常用事件(2)
- JavaScript创建对象的三种方式之利用构造函数创建对象及使用方法(3)
- Python入门--try-except-else
- 操作系统—死锁的概念
- Wannafly挑战赛21: C. 大水题(DP)
- bzoj 1406: [AHOI2007]密码箱