使用Python处理目录(一):打印目录下的文件名

要想遍历某一目录下的文件名,使用os.walk再方便不过了。他返回的是一个以元组为元素的列表。每一个元素都包含三个内容:路径,该路径下的子目录,该路径下的文件。

os.walk使用了生成器技术(关于该技术的说明请参考其它文档或者技术资料)yield,给使用者带来了非常大的使用上的灵活性。由于生成器技术使得会函数walk的调用一次只返回一个元组,节省了内存空间,提升了执行效率。

比如使用者只想得到当前目录这一层次的文件,而不想递归其子目录函数。如果walk没有使用生成器技术,则可能需要通过传参控制是否递归子目录,或者利用两个函数分别管理是否递归子目录。另外如果需要控制递归层次,也需要添加参数。如果不想这么麻烦,也可以一次性获取目录下所有文件(包括子目录下的),然后根据需要使用哪些文件,但是这样带来的后果是时间和空间都带来了极大的浪费。
而使用了yield技术,由于生成器每次只生成一个目录层次的内容,节省时间和空间,同时将控制权交给用户,由用户决定是否要递归子目录。

本文中主要的函数allFiles也运用了生成器技术,调用一次返回一个需要的文件,而不是一次性返回所有需要的列表,同样在使用的灵活性和效率上都有很好的表现。
另外allFiles添加了一些个性化的功能:
1、通过fnmatch对想要的文件格式进行匹配过滤,想要匹配的文件在参数patterns中通过分号传递要匹配的文件种类。例如*代表匹配所有文件,*txt代表匹配所有后缀名txt的文件。
2、single_level为True表示只处理一层目录,为False表示递归处理子目录。3、yield_folders表示是否将匹配的目录也输出。

# root根目录, patterns匹配文件格式, single_level是否进行目录深层次查找
import fnmatch, os
def allFiles(root, patterns = '*', single_level = False, yield_folders = False):
    patterns = patterns.split(';')
    for path, subdirs, files in os.walk(root):
        if yield_folders:
           #add subdirs to the tail of files
           files.extend(subdirs)
        files.sort()
        for name in files:
            for pattern in patterns:
                if fnmatch.fnmatch(name, pattern):
                    yield os.path.join(path, name)
                    break
        #only deal one level of the dir
        if single_level:
            break
for name in allFiles('I:\\pTest', single_level = True):
    print(name)

你可能感兴趣的:(python)