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