所谓遍历(Traversal),是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.
在python中有很多方法可以快速的遍历文件夹.本文的目的是想通过遍历文件夹来充分体会递归的思想和熟练使用os模块.如有纰漏希望小伙伴们批评指正.
1.需求
我在桌面上有一个"test"目录,现在我要遍历它,如果遇到文件夹,就输出"xx是文件夹",遇到文件就输出"xx是文件"
2.知识准备
2.1递归
遍历文件夹是一个简单的工作,通过for循环就可以完成,不过这里我用递归来完成它.
递归就是自己调用自己,在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归
来个小例子,比如求1加到10:
#求1+2+3+4+5+6+7+8+9+10
#用for循环的方法完成
>>> def count(num):
result=0
for i in range(1,num+1):
result += i
return result
>>> num = count(10)
>>> num
55
#求1+2+3+4+5+6+7+8+9+10
#用递归的方法完成
>>> def count(num):
if num==1:
return 1
return count(num-1)+num
>>> num = count(10)
>>> num
55
从上面的这段代码可以看出,在函数count(),内部调用了自己也就是count函数
有两点要注意的
给内部调用count传入的参数是num-1,在做递归的时候就是要假设当前步骤的下一步已经实现,直接拿来用就好了.在这个例子中要实现1加到10那么我就假设1加到9已经算完了,就是count(9),那么count(9)+10就好了
if num==1 这一步是给递归找出口,找不到出口就会一直调用下去,所以这一步也是很关键的.
2.2 os模块的一些方法
python中对文件夹的操作可以用os模块提供的一些函数,下面列出一些:
os.listdir(dir_path):参数是文件夹路径,作用是把改路径下的文件夹名和文件名存入一个列表
下面都是os.path下的函数
os.path.exists(dir_path):参数是文件夹路径,作用是判断这个文件夹是否存在,返回布尔值
os.path.join(dir_path,fileDirName):参数有二,第一个参数是文件夹路径,第二个参数是文件名.该函数的作用是拼凑文件的绝对路径
os.path.isdir(abspath):判断传入的参数是否是本机上的文件夹
os.path.isfile(abspath):判断传入的参数是否是文件
3.实现代码
#-*- coding:utf-8 -*-
import os
#获得一个目录下的所有的文件名和目录名(包含子目录,子文件)
def getALLDirAndFile(dir_path):
#判断目录是否存在,不存在直接结束函数
if not os.path.exists(dir_path):
print "文件不存在"
return
#把文件夹下的内容放入列表,便于下一步分析
listName = os.listdir(dir_path)
for fileDirName in listName:
#拼接成绝对路径
abspath = os.path.join(dir_path,fileDirName)
#print(abspath)
#判断该路径是否是目录,如果是目录,就用递归的方式继续遍历,不是的话就会退出
if os.path.isdir(abspath):
print abspath," 是目录"
#递归遍历目录
getALLDirAndFile(abspath)
#判断是否是文件
if os.path.isfile(abspath):
print abspath," 是文件"
if __name__ == "__main__":
getALLDirAndFile(r'C:\Users\hong\Desktop\test')
结果
C:\Users\hong\Desktop\test\a.html 是文件
C:\Users\hong\Desktop\test\a.txt 是文件
C:\Users\hong\Desktop\test\static 是目录
C:\Users\hong\Desktop\test\templates 是目录
C:\Users\hong\Desktop\test\templates\a.html 是文件
C:\Users\hong\Desktop\test\untitled0.py 是文件