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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM