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.sepos.altsep,則檔案將不匹配。

如果 *include_hidden* 為 true,則 “**” 模式將匹配隱藏目錄。

引發一個帶有引數 pathname, recursive審計事件 glob.glob

引發一個帶有引數 pathnamerecursiveroot_dirdir_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

引發一個帶有引數 pathnamerecursiveroot_dirdir_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.sepaltsep(如果可用)。

另請參閱

pathlib.PurePath.full_match()pathlib.Path.glob() 方法,它們呼叫此函式來實現模式匹配和 globbing。

在 3.13 版本中新增。

示例

考慮一個包含以下檔案的目錄: 1.gif2.txtcard.gif 和一個子目錄 sub,其中只包含檔案 3.txtglob() 將產生以下結果。請注意,路徑的任何前導元件都會保留。

>>> 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 模組提供高階路徑物件。