7.2.2 目录的遍历

目录的遍历有两种实现方法:递归函数、os.walk()。这两种方法的实现原理和步骤各不相同,下面一一介绍这些方法的使用。

1.递归函数

对于目录的遍历可以通过递归函数实现。5.3.5小节讲解了递归函数,递归函数可以在函数主体内直接或间接地调用函数本身。下面【例7-10】这段代码对第7章中的源代码目录进行遍历,输出该目录下所有的文件名称。

【例7-10.py】


01     # 递归遍历目录
02     import os                         # 导入os模块
03     def VisitDir(path):
04         li = os.listdir(path)
05         for p in li:
06             pathname = os.path.join(path, p)
07             if not os.path.isfile(pathname):
08                 VisitDir(pathname)
09             else:
10                 print (pathname)
11
12     if __name__ == "__main__":
13         path = r"D:\python例题源代码\ch07code"
14         VisitDir(path)

【代码说明】

·第3行代码定义了名为VisitDir()的函数,该函数以目录路径作为参数。

·第4行代码返回当前路径下所有的目录名和文件名。

·第6行代码调用os.path模块的函数join(),获取文件的完整路径,并保存到变量pathname。

·第7行代码判断pathname是否为文件。如果pathname表示目录,则递归调用VisitDir()继续遍历底层目录。否则,直接输出文件的完整路径。遍历输出结果如下所示。


D:\python例题源代码\ch07code\mysqlconfig.ini
D:\python例题源代码\ch07code\例7-1.py
D:\python例题源代码\ch07code\例7-10.py
D:\python例题源代码\ch07code\例7-2.py
D:\python例题源代码\ch07code\例7-3.py
D:\python例题源代码\ch07code\例7-4.py
D:\python例题源代码\ch07code\例7-5.py
D:\python例题源代码\ch07code\例7-6.py
D:\python例题源代码\ch07code\例7-7.py
D:\python例题源代码\ch07code\例7-8.py
D:\python例题源代码\ch07code\例7-9.py

·第14行代码调用VisitDir()作为程序的起点,遍历D:\python例题源代码\ch07code下所有目录。

2.os.walk()

os模块也提供了同名函数walk(),该函数是Python2.3开始发布的。os.walk()可用于目录的遍历,功能类似于os.path模块的函数walk()。os.walk()不需要回调函数,更容易使用。os.walk()的函数声明如下所示。


walk(top, topdown=True, onerror=None, followlinks=False)

【代码说明】

·参数top表示需要遍历的目录树的路径。

·参数topdown默认值为True,表示首先返回目录树下的文件,然后再遍历目录树的子目录。topdown的值为False,则表示先遍历目录树的子目录,返回子目录中的文件,最后返回根目录下的文件。

·参数onerror默认值为None,表示忽略文件遍历时产生的错误。如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历。

·该函数返回1个元组,该元组有3个元素。这3个元素分别表示每次遍历的路径名、目录列表和文件列表。

下面【例7-11】这段代码使用了os.walk()遍历目录D:\python例题源代码\ch07code。

【例7-11.py】


01     import os
02
03     def VisitDir(path):
04         for root,dirs,files in os.walk(path):
05             for filepath in files:
06                 print (os.path.join(root, filepath))
07
08     if __name__=="__main__":
09         path = r"D:\ python例题源代码\ch07code"
10         VisitDir(path)

使用os模块的函数walk()只要提供1个参数path,即待遍历的目录树的路径。os.walk()实现目录遍历的输出结果和递归函数实现目录遍历的输出结果相同。

注意 os.path.walk()在Python3中已经被移除。