前言
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 |