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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:42:39