zoukankan      html  css  js  c++  java
  • Python之获取文件夹中文件列表以及glob与fnmatch模块的使用

    获取文件夹中的文件列表
    print(os.listdir("../secondPackage"))  # ['__init__.py', 'secondCookBook.py', '文件与IO.py', 'testPackage', '迭代器与生成器.py']
    # 注释: curdir = '.'  pardir = '..'
    print(os.listdir(os.curdir))  # ['__init__.py', 'secondCookBook.py', '文件与IO.py', 'testPackage', '迭代器与生成器.py']
    print(os.listdir(os.pardir))  # ['__init__.py', 'cookBook', 'secondPackage', 'cookBook.py']
    通过某种方式过滤数据,可以考虑结合 os.path 库中的一些函数来使用列表推导。比如:
     通过isfile判断是否是文件
    files=[name for name in os.listdir("../secondPackage") if os.path.isfile(os.path.join("../secondPackage",name))]
    print(files)  # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
    
    # isdir判断是否是目录
    dirs=[name for name in os.listdir("../secondPackage") if os.path.isdir(os.path.join("../secondPackage",name))]
    print(dirs)  # ['testPackage']
    
    # 过滤一个目录的内容 startswith() 和 endswith()
    pyfiles = [name for name in os.listdir('../secondPackage')
                if name.endswith('.py')]
    print(pyfiles)  # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
    文件名的匹配,你可能会考虑使用 glob 或 fnmatch 模块
    glob模块的主要方法就是glob,该方法返回所有匹配的文件路径列表(list);该方法需要一个参数用来指定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),其返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。
    import glob
    # 在 secondPackage 文件夹下找所有的py 文件
    print(glob.glob(r"../secondPackage/*.py"))  # ['../secondPackage/__init__.py', '../secondPackage/secondCookBook.py', '../secondPackage/文件与IO.py', '../secondPackage/迭代器与生成器.py']
    
    #  iglob方法 获取一个迭代器( iterator )对象,使用它可以逐个获取匹配的文件路径名,与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而 glob.iglob一次只获取一个匹配路径
    print([res for res in glob.iglob(r"../secondPackage/*.py")])  # ['../secondPackage/__init__.py', '../secondPackage/secondCookBook.py', '../secondPackage/文件与IO.py', '../secondPackage/迭代器与生成器.py'] 
    glob模块支持的通配符:
    通配符
     
    功能
     
    *
     
    匹配0或多个字符
     
    **
    匹配所有文件、目录、子目录和子目录里的文件(3.5版本新增)
     
    ?   
     
    匹配1个字符,与正则表达式里的?不同  
     
     [exp]  
     
    匹配指定范围内的字符,如:[1-9]匹配1至9范围内的字符
     
    [!exp]
     
    匹配不在指定范围内的字符
    fnmatch模块,fnmatch、fnmatchcase、filter和translate
    • fnmatch:判断文件名是否符合特定的模式。
    • fnmatchcase:判断文件名是否符合特定的模式,区分大小写。
    • filter:返回输入列表中,符合特定模式的文件名列表。
    • translate:将通配符模式转换成正则表达式。
    import fnmatch
    print([name for name in os.listdir(os.curdir) if fnmatch.fnmatch(name,'*.py')])
    # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
    namelist=os.listdir(os.curdir)
    print(fnmatch.filter(namelist,'*.py'))  # 区别是接受的第一个参数是列表
    # ['__init__.py', 'secondCookBook.py', '文件与IO.py', '迭代器与生成器.py']
    fnmatch模块支持的通配符:
    通配符 含义
    * 匹配任何数量的字符
    匹配单个字符
    [seq] 匹配seq中的字符
    [!seq] 匹配除seq以外的任何字符
    glob模块和fnmatch模块区别
    fnmatch模块,都是利用os.listdir获取文件列表,然后通过字符串fnmatch模块进行文件名匹配的,而glob模块比较简单,直接 实现了os.listdir 加上 fnmatch的功能
    # 结合使用例子:
    pyfiles = glob.glob(r"../secondPackage/*.py")
    pystate=[(name,os.stat(name))for name in pyfiles]
    for name,state in pystate:
        print(name,state.st_size,state.st_mtime)
    # ../secondPackage/__init__.py 73 1550806762.0806901
    # ../secondPackage/secondCookBook.py 73 1550806783.724303
    # ../secondPackage/文件与IO.py 11685 1552458917.495922
    # ../secondPackage/迭代器与生成器.py 6428 1551944052.2551782
     
  • 相关阅读:
    Analysis of Hello2 source code
    CORS’s source, Principle and Implementation
    CDI Features(EL(SPEL),Decorator,Interceptor,Producer)
    Java Design Patterns(2)
    Cookie and Session
    Vue错误信息解决
    cdh搭建仓库
    cdh本地源安装-自用
    创建本地repo源
    dockerfile:python-cuda-nvidia-cudnn
  • 原文地址:https://www.cnblogs.com/zzy-9318/p/10524648.html
Copyright © 2011-2022 走看看