From b5d4d2a7d53f8c2926fd3004aeba0b8b38a3d111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Wed, 6 Jun 2001 06:24:38 +0000 Subject: Patch #409973: Speedup glob.glob, add fnmatch.filter. --- Lib/fnmatch.py | 20 ++++++++++++++++++++ Lib/glob.py | 13 ++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py index 182a9ef..da0bb34 100644 --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -37,6 +37,26 @@ def fnmatch(name, pat): pat = os.path.normcase(pat) return fnmatchcase(name, pat) +def filter(names, pat): + """Return the subset of the list NAMES that match PAT""" + import os,posixpath + result=[] + pat=os.path.normcase(pat) + if not _cache.has_key(pat): + res = translate(pat) + _cache[pat] = re.compile(res) + match=_cache[pat].match + if os.path is posixpath: + # normcase on posix is NOP. Optimize it away from the loop. + for name in names: + if match(name): + result.append(name) + else: + for name in names: + if match(os.path.normcase(name)): + result.append(name) + return result + def fnmatchcase(name, pat): """Test whether FILENAME matches PATTERN, including case. diff --git a/Lib/glob.py b/Lib/glob.py index eeb6bdd..d5e508a 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -18,7 +18,9 @@ def glob(pathname): else: return [] dirname, basename = os.path.split(pathname) - if has_magic(dirname): + if not dirname: + return glob1(os.curdir, basename) + elif has_magic(dirname): list = glob(dirname) else: list = [dirname] @@ -43,12 +45,9 @@ def glob1(dirname, pattern): names = os.listdir(dirname) except os.error: return [] - result = [] - for name in names: - if name[0] != '.' or pattern[0] == '.': - if fnmatch.fnmatch(name, pattern): - result.append(name) - return result + if pattern[0]!='.': + names=filter(lambda x: x[0]!='.',names) + return fnmatch.filter(names,pattern) magic_check = re.compile('[*?[]') -- cgit v0.12