glob
— Unix style pathname pattern expansion¶
Source code:Lib/glob.py
Theglob
module finds all the pathnames matching a specified patternaccording to the rules used by the Unix shell, although results are returned inarbitrary order. No tilde expansion is done, but*
,?
, and characterranges expressed with[]
will be correctly matched. This is done by usingtheos.scandir()
andfnmatch.fnmatch()
functions in concert, andnot by actually invoking a subshell.
Note that files beginning with a dot (.
) can only be matched bypatterns that also start with a dot,unlikefnmatch.fnmatch()
orpathlib.Path.glob()
.(For tilde and shell variable expansion, useos.path.expanduser()
andos.path.expandvars()
.)
For a literal match, wrap the meta-characters in brackets.For example,'[?]'
matches the character'?'
.
Theglob
module defines the following functions:
- glob.glob(pathname,*,root_dir=None,dir_fd=None,recursive=False,include_hidden=False)¶
Return a possibly empty list of path names that matchpathname, which must bea string containing a path specification.pathname can be either absolute(like
/usr/src/Python-1.5/Makefile
) or relative (like../../Tools/*/*.gif
), and can contain shell-style wildcards. Brokensymlinks are included in the results (as in the shell). Whether or not theresults are sorted depends on the file system. If a file that satisfiesconditions is removed or added during the call of this function, whethera path name for that file will be included is unspecified.Ifroot_dir is not
None
, it should be apath-like objectspecifying the root directory for searching. It has the same effect onglob()
as changing the current directory before calling it. Ifpathname is relative, the result will contain paths relative toroot_dir.This function can supportpaths relative to directory descriptors with thedir_fd parameter.
Ifrecursive is true, the pattern “
**
” will match any files and zero ormore directories, subdirectories and symbolic links to directories. If thepattern is followed by anos.sep
oros.altsep
then files will notmatch.Ifinclude_hidden is true, “
**
” pattern will match hidden directories.Raises anauditing event
glob.glob
with argumentspathname
,recursive
.Raises anauditing event
glob.glob/2
with argumentspathname
,recursive
,root_dir
,dir_fd
.Note
Using the “
**
” pattern in large directory trees may consumean inordinate amount of time.Note
This function may return duplicate path names ifpathnamecontains multiple “
**
” patterns andrecursive is true.Changed in version 3.5:Support for recursive globs using “
**
”.Changed in version 3.10:Added theroot_dir anddir_fd parameters.
Changed in version 3.11:Added theinclude_hidden parameter.
- glob.iglob(pathname,*,root_dir=None,dir_fd=None,recursive=False,include_hidden=False)¶
Return aniterator which yields the same values as
glob()
without actually storing them all simultaneously.Raises anauditing event
glob.glob
with argumentspathname
,recursive
.Raises anauditing event
glob.glob/2
with argumentspathname
,recursive
,root_dir
,dir_fd
.Note
This function may return duplicate path names ifpathnamecontains multiple “
**
” patterns andrecursive is true.Changed in version 3.5:Support for recursive globs using “
**
”.Changed in version 3.10:Added theroot_dir anddir_fd parameters.
Changed in version 3.11:Added theinclude_hidden parameter.
- glob.escape(pathname)¶
Escape all special characters (
'?'
,'*'
and'['
).This is useful if you want to match an arbitrary literal string that mayhave special characters in it. Special characters in drive/UNCsharepoints are not escaped, e.g. on Windowsescape('//?/c:/Quovadis?.txt')
returns'//?/c:/Quovadis[?].txt'
.Added in version 3.4.
- glob.translate(pathname,*,recursive=False,include_hidden=False,seps=None)¶
Convert the given path specification to a regular expression for use with
re.match()
. The path specification can contain shell-style wildcards.For example:
>>>importglob,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'>
Path separators and segments are meaningful to this function, unlike
fnmatch.translate()
. By default wildcards do not match pathseparators, and*
pattern segments match precisely one path segment.Ifrecursive is true, the pattern segment “
**
” will match any numberof path segments.Ifinclude_hidden is true, wildcards can match path segments that startwith a dot (
.
).A sequence of path separators may be supplied to theseps argument. Ifnot given,
os.sep
andaltsep
(if available) are used.See also
pathlib.PurePath.full_match()
andpathlib.Path.glob()
methods, which call this function to implement pattern matching andglobbing.Added in version 3.13.
Examples¶
Consider a directory containing the following files:1.gif
,2.txt
,card.gif
and a subdirectorysub
which contains only the file3.txt
.glob()
will producethe following results. Notice how any leading components of the path arepreserved.
>>>importglob>>>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/']
If the directory contains files starting with.
they won’t be matched bydefault. For example, consider a directory containingcard.gif
and.card.gif
:
>>>importglob>>>glob.glob('*.gif')['card.gif']>>>glob.glob('.c*')['.card.gif']
See also
Thefnmatch
module offers shell-style filename (not path) expansion.
See also
Thepathlib
module offers high-level path objects.