python标准库之glob模块:查找符合特定规则的文件路径名

前言

1、glob模块可以查找当前脚本目录(相对路径)下或者某一指定目录(绝对路径)符合特定规则的文件路径名,跟使用windows下的文件搜索差不多。

2、查找文件只用到三个匹配符:*,?, []。

①*通配符:匹配0个或多个字符;

②?单个字符通配符:匹配单个字符;

③[]字符范围:匹配指定范围内的字符,如:[0-9]匹配数字。

glob模块的用法

glob.glob

①返回所有匹配的文件路径列表

②只有一个参数 pathname :定义了文件路径匹配规则;可以是绝对路径,可以是相对路径。

代码示例:

import glob

#获取指定目录下的所有图片
print (glob.glob(r"/home/qiaoyunhao/*/*.png"))#加上r让字符串'/'不产生转义

#获取上级目录的所有.py文件
print (glob.glob(r'../*.py')) #相对路径

运行结果:

glob.iglob

①获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。

②与 glob.glob()的区别: glob.glob()同时获取所有的匹配路径;而 glob.iglob()一次只获取一个匹配路径。

代码示例:

import glob
#父目录中的.py文件
f = glob.iglob(r'../*.py')
print (f) #<generator object iglob at 0x00B9FF80>
for py in f:
    print (py)

运行结果:

查找路径

通配符

星号(*)匹配零个或多个字符

代码示例

import glob
for name in glob.glob('dir/*'): print (name)

运行结果:

dir/file.txt
dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt
dir/subdir

单个字符通配符

问号(?)匹配任何单个的字符。

代码示例:

import glob

for name in glob.glob('dir/file?.txt'):
    print (name)

运行结果:

dir/file1.txt
dir/file2.txt
dir/filea.txt
dir/fileb.txt

字符范围

当需要匹配一个特定的字符,[]表示匹配指定范围内的字符。

代码示例:

import glob
for name in glob.glob('dir/*[0-9].*'):
    print (name)

运行结果:

dir/file1.txt
dir/file2.txt

 

glob模式

前言

在计算机编程中,特别是类Unix环境,glob模式通过通配符来匹配文件名

例如:Unix命令:在某一目录中将目录内所有以扩展名为.txt的文件从当前目录拷贝到textfiles目录。

mv *.txt textfiles/  # 这里【*】是一个匹配任意数量字符基本通配符,*.txt就表示一个glob模式。另一个通用的通配符是【?】,它表示任意一个字符。

最常用的通配符是 *,?,[…]:

通配符描述例子匹配不匹配
* 匹配任意数量的字符包括空字符 Law* Law, Laws, or Lawyer  
*Law* Law, GrokLaw, or Lawyer.  
? 匹配任意一个字符 ?at Cat, cat, Bat or bat at
[abc] 匹配任意一个包含的字符 [CB]at Cat or Bat cat or bat
[a-z] 匹配任意一个给定范围的字符 Letter[0-9] Letter0, Letter1 etc. Letters or Letter

【注意】在所有以上例子中,路径分隔符(unix的/,windows的\)都不会被匹配。

在Linux和POSIX系统中[…]有以下两个扩展:

通配符描述例子匹配不匹配
[!abc] 不匹配任意一个包含的字符 [!C]at Bat, bat, or cat Cat
[!a-z] 不匹配任意一个给定范围的字符 Letter[!3-5] Letter1, Letter2 etc. Letter3, Letter4 or Letter5

与正则的比较:

Glob的通配符等价正则的表达式
? .
* .*

【注意】glob尝试匹配整个字符串(例如,S*.DOC将匹配S.DOC和SA.DOC,但不匹配POST.DOC或SURREY.DOCKS);正则只匹配子串除非使用^和$。所以S*.DOC的等价正则是^S.*\.DOC$。

node glob对常用通配符又做了一些扩展:

通配符描述例子匹配不匹配
** 匹配任意数量的字符包括空字符(包括路径分隔符) **/*.js /a/b/c.js  
!(pattern|pattern) 匹配除了()内以外的pattern !(abc|bcd) aaa,bbb abc.bcd
?(pattern|pattern) 匹配至多一个()内的pattern ?(abc|bcd) abc bbb
+(pattern|pattern) 匹配至少一个()内的pattern +(abc|bcd) abc bbb
*(pattern|pattern) 匹配任意个()内的pattern *(abc|bcd) abc bbb
@(pattern|pattern) 精确匹配()内的其中一个pattern @(abc|bcd) abc abd
posted @ 2021-11-09 09:25  习久性成  阅读(624)  评论(0编辑  收藏  举报