zoukankan      html  css  js  c++  java
  • 用 Python 定位特定类型文件

    定位特定文件

    定位特定的文件,可以使用 fnmatch 以及 glob 这两个标准库,我们下面来分别看一下。

    1. 使用 fnmatch 标准库

    一般的话我们想要查找特定类型的文件,可以通过字符串的前缀匹配和后缀匹配来查找,具体实例如下所示: 

    >>> import os
    >>> [txt for txt in os.listdir('.') if txt.endswith('.txt')]
    ['b.txt', 'a.txt']

    其实大部分的情况下这种用字符串匹配的方法来查找文件就足够可以满足需要,如果有些情况下需要更加灵活一点的字符串匹配,就可以使用 fnmatch 库,这是一个专门用来进行文件名匹配的库,支持使用通配符来进行文字匹配(比如'*','?'等)。

    fnmatch 这个库很简单,只有 4 个函数:fnmatch,fnmatchcase,filter,translate:

    • fnmatch:判断文件名是否符合特定的模式;

    • fnmatchcase:判断文件名是否符合特定的模式(不区分大小写);

    • filter:返回输入列表中,符合特定模式的文件名列表;

    • translate:将通配符模式转换成正则表达式。

    上面 4 个最常用是它的同名函数 fnmatch ,我的当前目录下有 4 个文件,分别是:a.txt,b.txt,c.py,test.py,下面我就用 fnmatch 函数来对当前目录下的这 4 个文件进行匹配性测试,具体请看下面代码:

    >>> import os
    >>> import fnmatch
    >>> os.listdir('.')
    ['test.py', 'c.py', 'b.txt', 'a.txt']
    >>> [txt for txt in os.listdir('.') if fnmatch.fnmatch(txt, '*.txt')]
    ['b.txt', 'a.txt']
    >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[a-c]*')]
    ['c.py', 'b.txt', 'a.txt']
    >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[!a-c]*')]
    ['test.py']

    fnmatchcase 函数与 fnmatch 函数几乎一样,只是在匹配的时候会忽略大小写字母;filter 函数与 fnmatch 比较类似,区别在于fnmatch 一次只对一个文件名匹配,而 filter 一次可以对多个文件名进行匹配判断,下面我们就再来看一下 filter 的用法:

    >>> import os
    >>> import fnmatch
    >>> file = os.listdir('.')
    >>> file
    ['test.py', 'c.py', 'b.txt', 'a.txt']
    >>> fnmatch.filter(file, '[a-c]*')
    ['c.py', 'b.txt', 'a.txt']
    >>> fnmatch.filter(file, '[!a-c]*')
    ['test.py']

    2.使用 glob 定位

    我们在上面介绍的获取特定类型的文件列表,首先是通过 os.listdir 获取全部的文件列表,然后通过字符串匹配或者使用 fnmatch 进行文件名模式匹配来定位,习惯了 Python 的简洁优雅,这多出来的一步总觉得哪里怪怪的,好在我现在知道了 glob。

    glob 的作用相当于 os.listdir + fnmatch 的组合,使用 glob 以后,就不需要用 os.listdir 获取文件列表,直接通过模式匹配就可以解决了,具体操作如下所示:

    >>> import glob
    >>> glob.glob('*.txt')
    ['b.txt', 'a.txt']
    >>> glob.glob('[a-c]*')
    ['c.py', 'b.txt', 'a.txt']
    >>> glob.glob('[!a-c]*')
    ['test.py']

    可以看到,Python 真的非常的灵活,光是定位目录下特定的文件类型我就已经介绍了 3 种方式,一般情况下就用字符串匹配就可以解决,如果需要更加灵活一点的的,可以使用 fnmatch 和 glob。

    遍历目录树

    再上一节中我们都是查找某个目录下的文件然后通过匹配去定位自己需要的文件类型。但是在实际的应用过程中我们更可能遇到的是某个目录及其子目录下的所有文件。比如查找某个目录及其子目录下所有的 txt 文件等等,对于这类的需求,我们可以使用 os 模块下的「walk」函数。walk 函数遍历某个目录及其子目录,对于每一个目录,walk 返回一个三元组,依次是「当前目录」,「当前目录下的子目录」,「当前目录下的文件列表」。

    下面我们来演示一下 os.walk 函数的用法,做一个小的练习,来遍历一下 /root/rocky0429 目录及其子目录下的所有 txt 和 图片文件:

    import os
    import fnmatch
    
    search = ['*.txt', '*.jpg', '*.jpeg']
    res = []
    
    for root, dirnames, filenames in os.walk(os.path.expanduser('~/rocky0429')):
       for extension in search:
           for filename in fnmatch.filter(filenames, extension):
               res.append(os.path.join(root,filename))
    
           print(res)
  • 相关阅读:
    设计模式之笔记--工厂方法模式(Factory Method)
    dmesg命令
    jumpserver2.3.0社区开源版
    container偶尔宕掉问题的解决记录
    sshd服务的白名单和黑名单
    /proc/sysrq-trigger文件
    ansible定义主机清单
    简述Etcd、Lvs、HAProxy
    ES6语法 let、const、for...of循环、展开运算符、ES6箭头函数、箭头函数和this、模板字面量、解构、对象字面量简写法、默认参数函数、super 和 extends、Object.assign()
    axios 将post请求时把对象obj数据转为formdata
  • 原文地址:https://www.cnblogs.com/key01/p/10208993.html
Copyright © 2011-2022 走看看