glob --- Unix 風格路徑名模式擴充套件

原始碼: Lib/glob.py


glob 模組會根據 Unix shell 所使用的規則找出所有匹配指定模式的路徑名,但返回結果的順序是任意的。 它不做波浪號(tilde)擴充套件,但 *, ? 和用 [] 表示的字元範圍將會被正確地匹配。 這是透過配合使用 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 必須是一個包含路徑規格的字串。pathname 可以是絕對路徑(如 /usr/src/Python-1.5/Makefile)或相對路徑(如 ../../Tools/*/*.gif),並且可以包含 shell 風格的萬用字元。 損壞的符號連結也會被包含在結果中(同 shell 一樣)。 結果是否排序取決於檔案系統。 如果在本函式呼叫期間,某個滿足條件的檔案被移除或新增,該檔案的路徑名是否會被包含在內是未指定的。

如果 root_dir 不為 None,它應為一個 類路徑物件,用於指定搜尋的根目錄。它對 glob() 的作用與在呼叫前更改當前目錄相同。如果 pathname 是相對路徑,結果將包含相對於 root_dir 的路徑。

此函式可以透過 dir_fd 引數來支援相對於目錄描述符的路徑

如果 recursive 為真值,模式 “**” 將匹配任何檔案和零個或多個目錄、子目錄以及指向目錄的符號連結。 如果該模式後跟一個 os.sepos.altsep,則檔案將不會匹配。

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

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

引發一個 審計事件 glob.glob/2,附帶引數 pathname, recursive, root_dir, dir_fd

備註

在大型目錄樹中使用 “**” 模式可能會消耗過多的時間。

備註

如果 pathname 包含多個 “**” 模式且 recursive 為真值,此函式可能會返回重複的路徑名。

在 3.5 版本發生變更: 支援使用 “**” 進行遞迴通配。

在 3.10 版本發生變更: 增加了 root_dirdir_fd 形參。

在 3.11 版本發生變更: 增加了 include_hidden 形參。

glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)

返回一個 迭代器,它產生與 glob() 相同的值,而無需同時將它們全部儲存在記憶體中。

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

引發一個 審計事件 glob.glob/2,附帶引數 pathname, recursive, root_dir, dir_fd

備註

如果 pathname 包含多個 “**” 模式且 recursive 為真值,此函式可能會返回重複的路徑名。

在 3.5 版本發生變更: 支援使用 “**” 進行遞迴通配。

在 3.10 版本發生變更: 增加了 root_dirdir_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() 方法會呼叫此函式來實現模式匹配和通配。

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