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.sep或os.altsep,則檔案將不會匹配。如果 include_hidden 為真值,“
**” 模式將匹配隱藏目錄。引發一個 審計事件
glob.glob,附帶引數pathname,recursive。引發一個 審計事件
glob.glob/2,附帶引數pathname,recursive,root_dir,dir_fd。備註
在大型目錄樹中使用 “
**” 模式可能會消耗過多的時間。備註
如果 pathname 包含多個 “
**” 模式且 recursive 為真值,此函式可能會返回重複的路徑名。在 3.5 版本發生變更: 支援使用 “
**” 進行遞迴通配。在 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()相同的值,而無需同時將它們全部儲存在記憶體中。引發一個 審計事件
glob.glob,附帶引數pathname,recursive。引發一個 審計事件
glob.glob/2,附帶引數pathname,recursive,root_dir,dir_fd。備註
如果 pathname 包含多個 “
**” 模式且 recursive 為真值,此函式可能會返回重複的路徑名。在 3.5 版本發生變更: 支援使用 “
**” 進行遞迴通配。在 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()方法會呼叫此函式來實現模式匹配和通配。在 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 模組提供了高階路徑物件。