3.2 遍历目录树
当我们在使用 open 函数打开一个文件时,如果以'r'模式打开一个不存在的文件,系统会抛出异常,这往往不是我们想要看到的结果。因此,如果我们能在打开之前先确认文件是存在的,就可以避免这样的异常出现。针对文件我们除了进行搜索文件、筛选文件及给文件重命名这些常规操作,可能还会涉及遍历某个文件夹下面的所有子文件夹和文件等操作。利用 Python 提供的 os 模块可以很方便地完成这些操作,而且由于 Python语法简洁,其用到的代码非常少。
【例3-12】 输出指定路径下的所有文件(不包括子文件夹下的文件)。
基本思路:先列出指定目录下所有的文件夹和文件,然后逐个判断是否为文件,若是则打印输出。
在对文件进行操作的时候,有时往往需要遍历指定路径下的所有文件(包括子文件夹下的所有文件),Python的os模块包含了很多有关文件、文件夹操作的方法。os模块的常用方法如表3-4所示。
表3-4 os模块的常用方法
【例 3-13】 有如下目录树结构,利用 os.walk(path)列出指定目录下的所有的文件夹和文件(包括子文件夹及子文件夹下的文件)。
以上代码中的dirpath为根目录,dienames为子目录,files为根目录下的文件。
但是要注意,os.walk(path)遍历的是指定目录下的整个目录树,所谓的根目录(字符串)、子目录(列表)、根目录下的文件(列表)是一层一层相对而言的。
【例3-14】 将指定目录生成目录树。
温馨提示:在以上程序运行之前,请确保你的电脑里有相应的目录结构;否则,请按照你电脑的目录结构先修改程序中的倒数第二行代码,然后再运行。以上结果是在作者的电脑上运行程序后得到的,只能作为参考。
【例3-15】 输出指定路径下的文件及所有子文件夹下的文件。
注意:从控制台输入的必须是绝对路径!
os.walk()是 Python 的内置函数,用于通过在目录树中游走来输出目录中的文件名。该函数创建一个生成器对象来遍历整棵目录树。
os.walk()方法的语法格式如下:
各参数的含义如下:
top——指定遍历的目录,返回的是一个三元组(root,dirs,files)。请注意,返回的不是一个含三个元素的元组,而是一个生成器。该生成器的每个元素是一个含三个元素的元组。可以使用 for-in 遍历循环输出生成器中的每个元素,因为生成器也是可迭代对象。至于如何输出os.walk()所返回的生成器里的元素,请看后面的例子。
root——当前正在遍历的目录,是一个字符串。
dirs——是一个列表,指定目录下所有的文件夹名(但不包括子文件夹名)。
files——同样是列表,指定目录下的所有文件名(但不包括子文件夹下的文件)。注意,这些文件名不包含路径信息。如果需要得到完整的路径信息,需要使用 os.path.join(str_dirpath,list_filenames)进行拼接。
topdown——可选,为 True,则先遍历 top 目录;否则,优先遍历 top 的子目录(默认为 True)。如果 topdown 参数为 True,将会遍历 top 文件夹及 top 文件夹中的每个子目录。
onerror——可选,默认为 None,表示忽略文件遍历时产生的错误。如果不为None,则用一个自定义函数来提示错误信息后是继续遍历还是抛出异常中止遍历。
【例 3-16】 测试 os.walk()输出的是一个生成器,并且该生成器的每个元素是一个含三个元素的元组。元组的第一个元素是一个字符串,第二、三个元素都是一个列表。
假设在本地D盘上有以下目录结构:
观察并理解以下每一条语句执行后所呈现的结果。
我们看到,通过 os.walk()方法可以得到指定目录下的所有文件夹名和文件名。注意,它们是分层呈现的。请结合上面的输出结果来理解 os.walk()的作用,进而掌握它的用法。
【例3-17】 输出指定路径下包括子文件夹的所有文件。