我们对文件操作时,往往要遍历整个文件目录。前面已经介绍了文件和目录的操作方法,也介绍了递归函数。现在介绍一下四种目录遍历的方法(思维)。
1、方法一(普通递归)
方法(思维):根据文件目录获取该目录下的所有文件,然后对这些文件进行判断,如果是文件夹,则调用函数本身,如果是普通文件,则打印出文件名。
代码如下:
#递归方法
import os
def getPath(path):
getDetailPath = os.listdir(path)
for detailPath in getDetailPath:
newDetailPath = os.path.join(path,detailPath)
if os.path.isdir(newDetailPath):
print("文件夹:%s" %(detailPath))
getPath(newDetailPath)
else:
print("文件:%s"%(detailPath))
getPath(r"D:\Code\log")
2、方法二(模拟栈)
栈特点:先进后出,模拟栈方法遍历目录,深度遍历。
方法(思维):先创建一个空的列表,把文件目录当做一个元素添加进列表,从列表末尾取出一个元素(文件目录),获取该目录下的所有文件,然后对这些文件进行判断,如果是文件夹,则调用函数本身(添加进列表),如果是普通文件,则打印出文件名,如此循环处理这个列表。
代码如下:
#模拟栈方法
import os
def getPath(path):
pathList = []
pathList.append(path)
while len(pathList) != 0:
newPath = pathList.pop()
getDetailPath = os.listdir(newPath)
for detailPath in getDetailPath:
newDetailPath = os.path.join(newPath,detailPath)
if os.path.isdir(newDetailPath):
print("文件夹:%s" % (detailPath))
getPath(newDetailPath)
else:
print("文件:%s" % (detailPath))
getPath(r"D:\Code\log")
3、方法三(模拟队列)
队列特点:先进先出,模拟队列方法遍历目录,广度遍历。
方法(思维):先生成一个队列,把文件目录当做一个元素添加进队列,从队列中取出一个元素(文件目录),获取该目录下的所有文件,然后对这些文件进行判断,如果是文件夹,则调用函数本身(添加进队列),如果是普通文件,则打印出文件名,如此循环处理这个队列。
代码如下:
#模拟队列
import os
import collections
def getPath(path):
pathQueue = collections.deque()
pathQueue.append(path)
while len(pathQueue) != 0:
newPath = pathQueue.popleft()
getDetailPath = os.listdir(newPath)
for detailPath in getDetailPath:
newDetailPath = os.path.join(newPath,detailPath)
if os.path.isdir(newDetailPath):
print("文件夹:%s" % (detailPath))
getPath(newDetailPath)
else:
print("文件:%s" % (detailPath))
getPath(r"D:\Code\log")
4、方法四(os.walk(path))
walk()方法主要参数有path,其他参数请参考官方文档
path:所要遍历的目录,它返回的是一个元组(root,dirs,files)
其中:
root 是指当前正在遍历的这个文件夹的本身的路径
dirs 是一个 list ,列表中的元素是该文件夹中所有的目录的名字(不包括子目录)
files 是一个 list , 列表中的元素是该文件夹中所有的文件(不包括子目录)
代码如下:
#os.walk() 方法
import os
def getPath(path):
for root,dirs,files in os.walk(path):
for file in files:
print("文件:"+file)
for dir in dirs:
print("文件夹:"+dir)
getPath(dir)
getPath(r"D:\Code\log")
领取专属 10元无门槛券
私享最新 技术干货