• 技术文章 >后端开发 >Python教程

    Python遍历目录中的所有文件的方法

    2016-07-22 08:56:25原创585
    os.walk生成器
    os.walk(PATH), PATH是个文件夹路径,当然可以用.或者../这样啦.
    返回的是个三元元组为元素的列表, 每个元素代表了一个文件夹下的内容.第一个就是当前文件夹下内容.
    返回的三元元组代表(该工作文件夹, 该文件夹下的文件夹的列表, 该文件夹下文件的列表).
    所以,
    获得所有子文件夹, 就是(d代表这三元元组):

    os.path.join(d[0],d[1]);
    

    获得所有子文件, 就是:

     os.path.join(d[0],d[2]);
    

    以下例子使用了两套循环, 遍历后得到所有文件名的list后再循环所有文件:

    result = [os.path.join(dp, f) for dp, dn, fs in os.walk("_pages") for f in fs if os.path.splitext(f)[1] == '.html']
    for fname in result:
     #do something
    

    实际等于

    result=[]
    for dp, dn, fs in os.walk("_pages"):
     for f in fs:
     if (os.path.splitext(f)[1] == '.html'):
      result.append(os.path.join(dp, f))
    for fname in result:
     #do something
    

    最后判断是否html后缀获得文件名, 还可以使用glob:

    result = [y for x in os.walk(PATH) for y in glob.glob(os.path.join(x[0], '*.txt'))]
    

    还可以使用迭代器方法:

    from itertools import chain
    import glob
    result = (chain.from_iterable(glob.iglob(os.path.join(x[0], '*.txt')) for x in os.walk('.')))
    

    进阶
    标准文件数遍历生成器os.walk既强大又灵活,不过os.walk还缺乏应用程序需要的一些细节上的处理能力,例如根据某种模式选择文件,对所有文件(或目录)进行排序,或只遍历当前目录不进入其子目录,因此需要对接口对应进行封装。

    import os, fnmatch 
     
    def filter_files(dirname, patterns='*', single_level=False, yield_folders=False): 
      patterns = patterns.split(';') 
      allfiles = [] 
      for rootdir, subdirname, files in os.walk(dirname): 
        print subdirname 
        allfiles.extend(files) 
        if yield_folders: 
          allfiles.extend(dubdirname) 
        if single_level: 
          break 
      allfiles.sort() 
      for eachpattern in patterns: 
        for eachfile in fnmatch.filter(allfiles, eachpattern): 
            print os.path.normpath(eachfile) 
    
    

    说明:
    1.extend与append的区别
    列表是以类的形式实现的。“创建”列表实际上是将一个类实例化。因此,列表有多种方法可以操作。 列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型。 append() 方法向列表的尾部添加一个新的元素。只接受一个参数,extend()方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。
    2. fnmatch模块
    fnmatch 模块使用模式来匹配文件名。模式语法和 Unix shell 中所使用的相同. 星号(*) 匹配零个或更多个字符, 问号(?) 匹配单个字符。你也可以使用方括号来指定字符范围,例如 [0-9] 代表一个数字,其他所有字符都匹配它们本身。
    1) fnmatch.fnmatch(name, pattern)方法:测试name是否匹配pattern,返回true/false
    2) fnmatch.filter(names, pat)实现列表特殊字符的过滤或筛选,返回符合匹配模式的字符列表,当然names表示的是列表

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python 遍历 文件
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一文掌握Python返回函数、闭包、装饰器、偏函数• 【吐血整理】50道Python面试题大全及答案(收藏)• Python可视化总结之matplotlib.pyplot基本参数详解• python能代替JavaScript吗• Python详细解析之二分查找算法
    1/1

    PHP中文网