You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:24:03