annotate Lib/glob.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents fb90e2ff95b7
children dafca4714298
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
1 """Filename globbing utility."""
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
570
34a761046dbd Use module 'os'
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
3 import os
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 37879
diff changeset
4 import re
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 import fnmatch
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
7 __all__ = ["glob", "iglob"]
570
34a761046dbd Use module 'os'
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
8
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 def glob(pathname):
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
10 """Return a list of paths matching a pathname pattern.
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
11
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
12 The pattern may contain simple shell-style wildcards a la fnmatch.
5242
a50df7f3a10a New doc strings.
Guido van Rossum <guido@python.org>
parents: 574
diff changeset
13
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
14 """
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
15 return list(iglob(pathname))
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
16
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
17 def iglob(pathname):
52892
792bb885029f Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49380
diff changeset
18 """Return an iterator which yields the paths matching a pathname pattern.
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
19
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
20 The pattern may contain simple shell-style wildcards a la fnmatch.
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
21
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
22 """
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
23 if not has_magic(pathname):
33332
062177de8685 Patch #941486: add os.path.lexists(). Also fix bug #940578 by using lexists in glob.glob.
Johannes Gijsbers <jlg@dds.nl>
parents: 18040
diff changeset
24 if os.path.lexists(pathname):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
25 yield pathname
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
26 return
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
27 dirname, basename = os.path.split(pathname)
18040
fb93dfbd8052 Patch #409973: Speedup glob.glob, add fnmatch.filter.
Martin v. Löwis <martin@v.loewis.de>
parents: 16072
diff changeset
28 if not dirname:
79378
fb90e2ff95b7 utilize yield from
Philip Jenvey <pjenvey@underboss.org>
parents: 71169
diff changeset
29 yield from glob1(None, basename)
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
30 return
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
31 if has_magic(dirname):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
32 dirs = iglob(dirname)
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
33 else:
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
34 dirs = [dirname]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
35 if has_magic(basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
36 glob_in_dir = glob1
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
37 else:
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
38 glob_in_dir = glob0
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
39 for dirname in dirs:
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
40 for name in glob_in_dir(dirname, basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
41 yield os.path.join(dirname, name)
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
42
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
43 # These 2 helper functions non-recursively glob inside a literal directory.
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
44 # They return a list of basenames. `glob1` accepts a pattern while `glob0`
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
45 # takes a literal basename (so it only has to check for its existence).
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 def glob1(dirname, pattern):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
48 if not dirname:
49380
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
49 if isinstance(pattern, bytes):
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
50 dirname = bytes(os.curdir, 'ASCII')
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
51 else:
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
52 dirname = os.curdir
15868
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
53 try:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
54 names = os.listdir(dirname)
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
55 except os.error:
3060cbfa01be Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 6519
diff changeset
56 return []
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 37879
diff changeset
57 if pattern[0] != '.':
45003
f15d3bf4ca56 Fix build error.
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 41575
diff changeset
58 names = [x for x in names if x[0] != '.']
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 37879
diff changeset
59 return fnmatch.filter(names, pattern)
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
61 def glob0(dirname, basename):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
62 if basename == '':
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
63 # `os.path.split()` returns an empty basename for paths ending with a
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
64 # directory separator. 'q*x/' should match only directories.
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 34365
diff changeset
65 if os.path.isdir(dirname):
34365
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
66 return [basename]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
67 else:
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
68 if os.path.lexists(os.path.join(dirname, basename)):
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
69 return [basename]
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
70 return []
aa246b9f6184 Patch #943206:
Johannes Gijsbers <jlg@dds.nl>
parents: 33332
diff changeset
71
574
03b9f152adb6 Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents: 570
diff changeset
72
6519
24da035ceb6e Convert all remaining *simple* cases of regex usage to re usage.
Guido van Rossum <guido@python.org>
parents: 5242
diff changeset
73 magic_check = re.compile('[*?[]')
49380
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
74 magic_check_bytes = re.compile(b'[*?[]')
574
03b9f152adb6 Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents: 570
diff changeset
75
107
1e007dccb270 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 def has_magic(s):
49380
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
77 if isinstance(s, bytes):
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
78 match = magic_check_bytes.search(s)
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
79 else:
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
80 match = magic_check.search(s)
8a7c930abab6 Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents: 45003
diff changeset
81 return match is not None