Python recipe(14):遍历目录
代码何在?
Example Source Code [http://www.cnblogs.com/tomsheep/]
''' Created on 2010-5-25 @author: lk ''' import os, errno, fnmatch def mkdirs(newdir, mode=777): try:os.makedirs(newdir, mode=0777) except OSError, err: print repr(err), err.errno, errno.EEXIST, os.path.isdir(newdir) if err.errno != errno.EEXIST or not os.path.isdir(newdir): raise def listFiles(root, patterns='*', recurse=1, ret_folders=0): pattern_list = patterns.split(';'); class Bunch: def __init__(self, **kwds): self.__dict__.update(kwds) args = Bunch(recurse=recurse, pattern_list=pattern_list, ret_folders=ret_folders, results=[]) def visit(arg, dirname, files): print ">>>",dirname, files for filename in files: fullname = os.path.normpath(os.path.join(dirname, filename)) if arg.ret_folders or os.path.isfile(fullname): for pattern in pattern_list: if fnmatch.fnmatch(fullname, pattern): arg.results.append(fullname) break if not arg.recurse:files[:]=[] print "<<<",dirname, files os.path.walk(root, visit, args) return args.results if __name__ == '__main__': # mkdirs(r'D:\test') # mkdirs(r'D:\Data.dat') # os.path.walk("D:\\download", visit, None) path = r'D:\ftp' # for item in listFiles(path,'*.ape'): # print item results = listFiles(path)
以上代码改写自Python Cookbook 4-18 4-19
概述:
提供有筛选地便利目录功能
代码说明:
1. 最开始的mkdirs函数和这个walk功能不相干,是一个简单的创建目录函数,包装了os.mkdirs
2. os.path.walk函数提供了便利目录的机制,listFiles对它进行了封装。os.path.walk的第二个参数是一个回调函数,第三个参数则是传给这个回调函数的参数,这里我们因为要传多个参数,所以定义了一个内部类Bunch来打包。关于回调函数visit,第一个参数即刚才用户传入的参数,第二个则是便利过程中当前目录的名字,第三个参数files则是这个目录下所有项(目录+文件)的列表,而要注意的是walk的便利规则是,当一个目录的visit完成后,他会默认继续对刚才那个files列表中的目录项进行递归visit。所以我们上面有一步操作if not arg.recurse:files[:]=[] 就是在必要时将files清空,禁止递归。
3. fnmatch模块专门用以文件名匹配
* 任意名称
? 任意字符
[seq] seq中的任意字符
[!seq] 不再seq中的任意字符