Mercurial > cpython-lru_cache-weakref
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 |
| rev | line source |
|---|---|
| 5242 | 1 """Filename globbing utility.""" |
| 107 | 2 |
| 570 | 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 | 5 import fnmatch |
| 6 | |
| 34365 | 7 __all__ = ["glob", "iglob"] |
| 570 | 8 |
| 107 | 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 | 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 | 13 |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
14 """ |
| 34365 | 15 return list(iglob(pathname)) |
| 16 | |
| 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 | 19 |
| 20 The pattern may contain simple shell-style wildcards a la fnmatch. | |
| 21 | |
| 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 | 25 yield pathname |
| 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 | 29 yield from glob1(None, basename) |
| 34365 | 30 return |
| 31 if has_magic(dirname): | |
| 32 dirs = iglob(dirname) | |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
33 else: |
| 34365 | 34 dirs = [dirname] |
| 35 if has_magic(basename): | |
| 36 glob_in_dir = glob1 | |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
37 else: |
| 34365 | 38 glob_in_dir = glob0 |
| 39 for dirname in dirs: | |
| 40 for name in glob_in_dir(dirname, basename): | |
| 41 yield os.path.join(dirname, name) | |
| 42 | |
| 43 # These 2 helper functions non-recursively glob inside a literal directory. | |
| 44 # They return a list of basenames. `glob1` accepts a pattern while `glob0` | |
| 45 # takes a literal basename (so it only has to check for its existence). | |
| 107 | 46 |
| 47 def glob1(dirname, pattern): | |
| 34365 | 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 | 60 |
| 34365 | 61 def glob0(dirname, basename): |
| 62 if basename == '': | |
| 63 # `os.path.split()` returns an empty basename for paths ending with a | |
| 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 | 66 return [basename] |
| 67 else: | |
| 68 if os.path.lexists(os.path.join(dirname, basename)): | |
| 69 return [basename] | |
| 70 return [] | |
| 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 | 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 |
