如何实现Python2和Python3兼容的glob.glob、glob.iglob递归调用
你原有Python2版本代码返回空列表的原因是:Python2的
glob模块不支持**通配符的递归匹配逻辑,该特性仅在Python3+且指定recursive=True时生效。
兼容Python2/3的递归文件匹配方案
问题1:适配glob.glob()递归需求
可以用全版本兼容的os.walk手动实现递归搜索,逻辑和Python3原生glob.glob(recursive=True)效果完全一致:
import os def get_filepath(): target_filename = "com.google.Chrome.plist" search_root = "Users" # 如果是系统根目录下的Users路径,修改为"/Users"即可 result = [] for root, dirs, files in os.walk(search_root): if target_filename in files: result.append(os.path.join(root, target_filename)) return result print(get_filepath())
上述代码在Python2.7及Python3全版本均可正常运行,返回结果和你原有Python3版本的代码输出一致。
如果希望Python3环境下优先用原生glob实现(性能更高),也可以加版本判断分支:
import sys import glob def get_filepath(): if sys.version_info.major == 3: return glob.glob('Users/**/com.google.Chrome.plist', recursive=True) # Python2 分支走os.walk实现 import os target_filename = "com.google.Chrome.plist" search_root = "Users" result = [] for root, dirs, files in os.walk(search_root): if target_filename in files: result.append(os.path.join(root, target_filename)) return result
问题2:扩展到glob.iglob()使用场景
glob.iglob()是迭代器版本的实现,不会一次性加载所有结果到内存,适合搜索范围大、文件数量多的场景,对应用生成器实现即可:
import os def get_filepath_iglob(): target_filename = "com.google.Chrome.plist" search_root = "Users" # 按需修改为"/Users" for root, dirs, files in os.walk(search_root): if target_filename in files: yield os.path.join(root, target_filename) # 使用方式和原生iglob一致,迭代返回结果 for path in get_filepath_iglob(): print(path)
同样支持加版本判断,Python3环境优先调用原生glob.iglob:
import sys import glob def get_filepath_iglob(): if sys.version_info.major == 3: return glob.iglob('Users/**/com.google.Chrome.plist', recursive=True) # Python2 走生成器实现 import os target_filename = "com.google.Chrome.plist" search_root = "Users" for root, dirs, files in os.walk(search_root): if target_filename in files: yield os.path.join(root, target_filename)
内容的提问来源于stack exchange,提问作者dig_123
相关产品推荐
相关产品推荐

