Mercurial > cpython-lru_cache-weakref
annotate Lib/glob.py @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | 6886e0bf29bc |
| children | 4af260a54e05 8c17e898e0e8 |
| 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: |
|
49380
8a7c930abab6
Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents:
45003
diff
changeset
|
29 for name in glob1(None, basename): |
| 34365 | 30 yield name |
| 31 return | |
| 32 if has_magic(dirname): | |
| 33 dirs = iglob(dirname) | |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
34 else: |
| 34365 | 35 dirs = [dirname] |
| 36 if has_magic(basename): | |
| 37 glob_in_dir = glob1 | |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
38 else: |
| 34365 | 39 glob_in_dir = glob0 |
| 40 for dirname in dirs: | |
| 41 for name in glob_in_dir(dirname, basename): | |
| 42 yield os.path.join(dirname, name) | |
| 43 | |
| 44 # These 2 helper functions non-recursively glob inside a literal directory. | |
| 45 # They return a list of basenames. `glob1` accepts a pattern while `glob0` | |
| 46 # takes a literal basename (so it only has to check for its existence). | |
| 107 | 47 |
| 48 def glob1(dirname, pattern): | |
| 34365 | 49 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
|
50 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
|
51 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
|
52 else: |
|
8a7c930abab6
Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents:
45003
diff
changeset
|
53 dirname = os.curdir |
|
15868
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
54 try: |
|
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
55 names = os.listdir(dirname) |
|
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
56 except os.error: |
|
3060cbfa01be
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
6519
diff
changeset
|
57 return [] |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
58 if pattern[0] != '.': |
|
45003
f15d3bf4ca56
Fix build error.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
41575
diff
changeset
|
59 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
|
60 return fnmatch.filter(names, pattern) |
| 107 | 61 |
| 34365 | 62 def glob0(dirname, basename): |
| 63 if basename == '': | |
| 64 # `os.path.split()` returns an empty basename for paths ending with a | |
| 65 # 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
|
66 if os.path.isdir(dirname): |
| 34365 | 67 return [basename] |
| 68 else: | |
| 69 if os.path.lexists(os.path.join(dirname, basename)): | |
| 70 return [basename] | |
| 71 return [] | |
| 72 | |
|
574
03b9f152adb6
Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents:
570
diff
changeset
|
73 |
|
6519
24da035ceb6e
Convert all remaining *simple* cases of regex usage to re usage.
Guido van Rossum <guido@python.org>
parents:
5242
diff
changeset
|
74 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
|
75 magic_check_bytes = re.compile(b'[*?[]') |
|
574
03b9f152adb6
Never return a non-existing pathname.
Guido van Rossum <guido@python.org>
parents:
570
diff
changeset
|
76 |
| 107 | 77 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
|
78 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
|
79 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
|
80 else: |
|
8a7c930abab6
Issue #3187: Better support for "undecodable" filenames. Code by Victor
Guido van Rossum <guido@python.org>
parents:
45003
diff
changeset
|
81 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
|
82 return match is not None |
