Python recipe(14):遍历目录

代码何在?

div css xhtml xml Example Source Code 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中的任意字符

posted on 2010-05-25 21:23  tomsheep  阅读(820)  评论(0编辑  收藏  举报

导航