在这一篇文章中,我们会在os.walk函数的基础上,封装一个查找文件的函数。如果读者是一位编程经验还不太丰富的工程师,相信可以从这篇文章中受到一些启发,并在以后的工作中,更加能够编写出扩展性强、可读性强、好维护的代码。
1 使用os.walk遍历目录树
为了避免读者不了解os.walk函数,从而无法理解这篇文章在就讲什么。因此,在正式介绍今天的主题之前,我们先来看一下os.walk函数的使用。
os.walk函数用以查找某个目录下的文件和目录,相对于os.listdir,os.walk不但会列出当前目录下的文件和目录,还会递归地遍历目录下的子目录。例如,查找某个目录及其子目录下所有的图片文件。对于这个查找图片的需求,可以使用os.walk函数。os.walk函数遍历某个目录及其子目录,对于每一个目录,walk返回一个三元组(dirpath, dirnames, filenames)。其中,dirpath保存的是当前目录,dirnames是当前目录下的子目录列表,filenames是当前目录下的文件列表。
下面的代码演示了os.walk函数的用法,使用os.walk函数遍历lmx这个用户的HOME目录及其子目录,并找到所有的图片文件:
#!/usr/bin/python
#-*- coding: UTF-8 -*-
import os
import fnmatch
images = ['*.jpg', '*.jpeg', '*.png', '*.tif', '*.tiff']
matches = []
for root, dirnames, filenames in os.walk(os.path.expanduser("~lmx")):
for extensions in images:
for filename in fnmatch.filter(filenames, extensions):
matches.append(os.path.join(root, filename))
print(matches)
在这段代码中,我们查找lmx这个用户的HOME目录及其子目录,然后通过fnmatch进行文件扩展名匹配。如果文件匹配了某一个扩展名,则会将该文件保存到结果列表(matches)中。
基于os.walk函数,我们还可以实现一个功能,那就是在遍历目录及其子目录时,如果想要忽略掉某一个子目录,可以直接修改三元组中的dirnames。即从dirnames这个列表中移除需要忽略掉的目录,就实现了查找文件时排除某个目录的目的。如下所示:
for root, dirnames, filenames in os.walk(os.path.expanduser("~lmx/t")):
......
if 'exclude_dir' in dirnames:
dirnames.remove('exclude_dir')
2 封装成函数
在前面的例子中,我们演示了os.walk函数的用法。现在,大家都知道这段程序的作用,是找到某个目录下所有的图片文件。但是,假设读者没有阅读到前面的说明文字,仅仅是阅读了代码,是否能够快速地知道这段程序的作用呢?或者说,读者下次再来看这段代码,能否快速的知道这段代码的作用呢?
这就涉及到一个代码编程规范:在编程时,我们应该尽可能将代码封装到函数中,并为函数取一个顾名思义的名字,以提高程序的可读性。我们一起来尝试一下,为上面的代码取一个顾名思义的名字&#