glob
— Unix 風格的路徑名模式擴充套件¶
原始碼: Lib/glob.py
glob
模組根據 Unix shell 使用的規則查詢所有與指定模式匹配的路徑名,儘管結果以任意順序返回。 不進行波浪號擴充套件,但 *
、?
和用 []
表示的字元範圍將被正確匹配。 這是透過協同使用 os.scandir()
和 fnmatch.fnmatch()
函式來完成的,而不是透過實際呼叫子 shell。
請注意,以點號 (.
) 開頭的檔案只能被也以點號開頭的模式匹配,這與 fnmatch.fnmatch()
或 pathlib.Path.glob()
不同。 (對於波浪號和 shell 變數擴充套件,請使用 os.path.expanduser()
和 os.path.expandvars()
。)
對於字面匹配,將元字元括在方括號中。 例如,'[?]'
匹配字元 '?'
。
glob
模組定義了以下函式
- glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)¶
返回與 *pathname* 匹配的路徑名列表(可能為空),該路徑名必須是包含路徑規範的字串。 *pathname* 可以是絕對路徑(例如
/usr/src/Python-1.5/Makefile
)或相對路徑(例如../../Tools/*/*.gif
),並且可以包含 shell 風格的萬用字元。 斷開的符號連結包含在結果中(與 shell 中一樣)。 結果是否排序取決於檔案系統。 如果在呼叫此函式期間刪除或添加了滿足條件的檔案,則不指定是否將包含該檔案的路徑名。如果 *root_dir* 不是
None
,則它應該是一個 路徑類物件,用於指定搜尋的根目錄。 它對glob()
的影響與在呼叫它之前更改當前目錄的效果相同。 如果 *pathname* 是相對路徑,則結果將包含相對於 *root_dir* 的路徑。此函式可以使用 *dir_fd* 引數支援 相對於目錄描述符的路徑。
如果 *recursive* 為 true,則模式 “
**
” 將匹配任何檔案和零個或多個目錄、子目錄以及指向目錄的符號連結。 如果模式後跟os.sep
或os.altsep
,則檔案將不匹配。如果 *include_hidden* 為 true,則 “
**
” 模式將匹配隱藏目錄。引發一個帶有引數
pathname
,recursive
的 審計事件glob.glob
。引發一個帶有引數
pathname
、recursive
、root_dir
、dir_fd
的 審計事件glob.glob/2
。註解
在大型目錄樹中使用 “
**
” 模式可能會消耗大量時間。註解
如果 *pathname* 包含多個 “
**
” 模式並且 *recursive* 為 true,則此函式可能會返回重複的路徑名。在 3.5 版本中更改: 支援使用“
**
”進行遞迴 glob。在 3.10 版本中更改: 添加了 *root_dir* 和 *dir_fd* 引數。
在 3.11 版本中更改: 添加了 *include_hidden* 引數。
- glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)¶
返回一個 迭代器,它產生與
glob()
相同的值,而無需實際同時儲存它們。引發一個帶有引數
pathname
,recursive
的 審計事件glob.glob
。引發一個帶有引數
pathname
、recursive
、root_dir
、dir_fd
的 審計事件glob.glob/2
。註解
如果 *pathname* 包含多個 “
**
” 模式並且 *recursive* 為 true,則此函式可能會返回重複的路徑名。在 3.5 版本中更改: 支援使用“
**
”進行遞迴 glob。在 3.10 版本中更改: 添加了 *root_dir* 和 *dir_fd* 引數。
在 3.11 版本中更改: 添加了 *include_hidden* 引數。
- glob.escape(pathname)¶
轉義所有特殊字元 (
'?'
、'*'
和'['
)。 如果要匹配可能包含特殊字元的任意字面字串,這將非常有用。 驅動器/UNC 共享點中的特殊字元不會被轉義,例如在 Windows 上,escape('//?/c:/Quo vadis?.txt')
返回'//?/c:/Quo vadis[?].txt'
。在 3.4 版本中新增。
- glob.translate(pathname, *, recursive=False, include_hidden=False, seps=None)¶
將給定的路徑規範轉換為正則表示式,以便與
re.match()
一起使用。路徑規範可以包含 shell 風格的萬用字元。例如:
>>> import glob, re >>> >>> regex = glob.translate('**/*.txt', recursive=True, include_hidden=True) >>> regex '(?s:(?:.+/)?[^/]*\\.txt)\\Z' >>> reobj = re.compile(regex) >>> reobj.match('foo/bar/baz.txt') <re.Match object; span=(0, 15), match='foo/bar/baz.txt'>
路徑分隔符和段對於此函式是有意義的,這與
fnmatch.translate()
不同。預設情況下,萬用字元不匹配路徑分隔符,並且*
模式段精確匹配一個路徑段。如果 recursive 為真,則模式段 “
**
” 將匹配任意數量的路徑段。如果 include_hidden 為真,則萬用字元可以匹配以點號 (
.
) 開頭的路徑段。可以將一系列路徑分隔符提供給 seps 引數。如果未提供,則使用
os.sep
和altsep
(如果可用)。另請參閱
pathlib.PurePath.full_match()
和pathlib.Path.glob()
方法,它們呼叫此函式來實現模式匹配和 globbing。在 3.13 版本中新增。
示例¶
考慮一個包含以下檔案的目錄: 1.gif
、2.txt
、card.gif
和一個子目錄 sub
,其中只包含檔案 3.txt
。 glob()
將產生以下結果。請注意,路徑的任何前導元件都會保留。
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
>>> glob.glob('**/*.txt', recursive=True)
['2.txt', 'sub/3.txt']
>>> glob.glob('./**/', recursive=True)
['./', './sub/']
如果目錄包含以 .
開頭的檔案,則預設情況下不會匹配它們。例如,考慮一個包含 card.gif
和 .card.gif
的目錄
>>> import glob
>>> glob.glob('*.gif')
['card.gif']
>>> glob.glob('.c*')
['.card.gif']
另請參閱
fnmatch
模組提供 shell 風格的檔名(而不是路徑)擴充套件。
另請參閱
pathlib
模組提供高階路徑物件。