如何在Python中兼容文件的.yaml和.yml两种扩展名?
问题描述
我正在从模板目录中查找文件,需要找到copier.yaml(或copier.yml)文件,目前使用的代码如下:
copier_yaml = template_dir / "copier.yaml" # a pathlib.Path params = yaml.safe_load(copier_yaml.read_text())
现在意识到为了完全兼容copier工具,应该同时支持.yaml和.yml两种扩展名,有没有Pythonic的实现方式?
解决方案
方案一:依次检查目标文件
利用pathlib.Path的exists()方法,结合生成器表达式快速定位第一个存在的文件:
from pathlib import Path import yaml template_dir = Path("你的模板目录路径") # 定义两种可能的文件名 candidate_files = [template_dir / f"copier.{ext}" for ext in ("yaml", "yml")] # 获取第一个存在的文件,不存在则返回None copier_yaml = next((f for f in candidate_files if f.exists()), None) if not copier_yaml: raise FileNotFoundError("模板目录中未找到copier.yaml或copier.yml文件") params = yaml.safe_load(copier_yaml.read_text())
这种写法逻辑清晰,直接明确要检查的扩展名,可读性强,完全贴合Python的简洁风格。
方案二:用glob匹配
借助pathlib.Path.glob()的通配符匹配能力,一次性筛选符合条件的文件:
from pathlib import Path import yaml template_dir = Path("你的模板目录路径") # 精准匹配copier.yaml或copier.yml copier_yaml = next(template_dir.glob("copier.{yaml,yml}"), None) if not copier_yaml: raise FileNotFoundError("模板目录中未找到copier.yaml或copier.yml文件") params = yaml.safe_load(copier_yaml.read_text())
glob()的{yaml,yml}语法可以直接匹配两种扩展名,next()获取第一个匹配结果,代码更紧凑,适合需要扩展更多扩展名的场景。
两种方案都属于Pythonic的实现,都充分利用了pathlib(Python推荐的文件路径处理库)的特性,避免了繁琐的字符串拼接和条件判断。
内容的提问来源于stack exchange,提问作者Pierrick Rambaud
相关产品推荐
相关产品推荐

