如何用路径通配符查找文件?Python os.rename失效的替代方案
解决Python os.rename无法识别通配符路径的问题
Linux下cp "/home/temp/test-*/sample" "./"能通过shell解析通配符找到目标文件,但Python的os.rename不支持自动处理*这类shell通配符——因为通配符解析是shell的专属功能,Python文件操作函数只会直接接收路径字符串,不会自动展开通配符。以下是两种可行的替代方案:
方案一:使用glob模块(推荐)
glob是Python标准库中专门用于路径通配符匹配的模块,能直接解析*等通配符,返回匹配的文件路径列表:
import glob import os # 匹配所有符合规则的文件路径 matched_files = glob.glob("/home/temp/test-*/sample") # 遍历处理匹配到的文件(如果有多个匹配结果,可按需调整逻辑) for src_path in matched_files: # 确认路径是文件而非目录 if os.path.isfile(src_path): # 移动文件到当前目录,目标文件名保留为sample os.rename(src_path, "./sample") # 若需复制而非移动,改用shutil.copy(src_path, "./sample")
如果确定只会有一个匹配文件,可简化为:
import glob import os src_path = glob.glob("/home/temp/test-*/sample")[0] if os.path.isfile(src_path): os.rename(src_path, "./sample")
方案二:调用shell命令
直接通过subprocess模块调用shell执行原有的命令,让shell负责通配符解析:
import subprocess # 执行移动操作(对应os.rename的功能) subprocess.run('mv "/home/temp/test-*/sample" "./"', shell=True, check=True) # 若需执行复制操作,改用cp命令 # subprocess.run('cp "/home/temp/test-*/sample" "./"', shell=True, check=True)
两种方案对比
- glob模块:纯Python实现,不依赖shell,跨平台性好,能灵活控制匹配结果的处理逻辑,无shell注入风险。
- subprocess调用shell:代码和原shell命令几乎一致,上手快,但依赖系统shell,若路径包含不可控内容可能存在安全风险,且跨平台兼容性较差。
内容的提问来源于stack exchange,提问作者Lava Sangeetham
相关产品推荐
相关产品推荐

