查找和过滤文件:fnmatch和glob

1.普通文本匹配

大部分情况下,利用字符串匹配可以完成文件查找和过滤,毕竟python工程师还是比较熟悉字符串对象的方法

>>> import os
>>> os.listdir(".")
['a1.txt', 'b1.txt', 'd2.jpg', 'c2.jpg']
>>> [f for f in os.listdir(".") if f.endswith(".txt")]
['a1.txt', 'b1.txt']
>>> [f for f in os.listdir(".") if f.startswith(("a", "c"))]
['a1.txt', 'c2.jpg']

2.fnmatch模块

如果需要更加灵活的字符串匹配,可以使用标准库的fnmatch库,这个库专门用来进行文件名匹配,支持使用通配符进行字符串匹配,当进行比较复杂的匹配时,这个库很好用。
fnmatch支持的通配符如图所示

通配符 含义
* 匹配任意数量的字符
匹配单个字符
[seq] 匹配seq中的字符
[!seq] 匹配除了seq以外的任何字符

fnmatch库只有4个函数,分别是fnmatch、fnmatchcase、filter、translate,其中最常用的就是fnmatch函数

  • fnmatch: 判断文件名是否符合特定的模式
  • fnmatchcase: 同上,但是不区分大小写
  • filter: 返回第一个参数中,符合特定模式的文件名列表
  • translate: 将通配符模式转换成正则表达式(核心,提供一种翻译功能)

接下来,演示fnmatch和filter函数的使用
fnmatch(name:str, pattern:str) ->bool

>>> import fnmatch
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "*.txt")]
['a1.txt', 'b1.txt']
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "[a-c]*")]
['a1.txt', 'b1.txt', 'c2.jpg']
>>> [f for f in os.listdir(".") if fnmatch.fnmatch(f, "[!a-c]*")]
['d2.jpg']

filter(names:list, pattern:str) ->list

>>> fnmatch.filter(os.listdir("."), "[bd]*")
['b1.txt', 'd2.jpg']

3.glob模块

到目前为止,我们要获取特定类型的文件列表,都是先通过os.listdir获取文件列表,然后使用字符串匹配或fnmatch库进行文件名模式匹配来查找文件和过滤文件。
但是作为一名python程序员,应该追求用最少的代码完成同样的需求,所以标准库还提供了一个glob库=os.listdir+fnmatch(从它的导入模块就能看出来)

>>> import glob
>>> glob.glob("*.txt")
['a1.txt', 'b1.txt']

可以看到,Python非常灵活,有三种方法对指定目录下的特定类型文件进行查找和过滤

猜你喜欢

转载自blog.csdn.net/weixin_42237702/article/details/100945186