如何用PyYaml遍历docker-compose.yaml中的用户可自定义文本值?
解决方案
1. 无现成框架直接满足需求
没有专门的框架能无需指定键就自动筛选并遍历Docker Compose里的文本类型自定义参数,你需要基于PyYAML解析后的嵌套结构,自行实现递归遍历逻辑。
2. 基于PyYAML实现递归遍历文本值
PyYAML会把Docker Compose文件解析成嵌套的字典(dict)和列表(list)结构,你可以通过递归遍历所有节点,筛选出字符串类型(str)的值,还能同步记录值所在的嵌套路径,方便定位参数位置。
示例代码
import yaml def collect_text_values(data, current_path=""): text_values = [] if isinstance(data, dict): for key, value in data.items(): new_path = f"{current_path}.{key}" if current_path else key text_values.extend(collect_text_values(value, new_path)) elif isinstance(data, list): for idx, item in enumerate(data): new_path = f"{current_path}[{idx}]" if current_path else f"[{idx}]" text_values.extend(collect_text_values(item, new_path)) elif isinstance(data, str): text_values.append((current_path, data)) return text_values # 解析Docker Compose文件 with open("docker-compose.yaml", "r") as f: compose_data = yaml.safe_load(f) # 收集所有文本值 text_params = collect_text_values(compose_data) # 打印结果并统计数量 print(f"共找到 {len(text_params)} 个可自定义文本参数:") for path, value in text_params: print(f"- {path}: `{value}`")
3. 对比不同Docker Compose文件
要对比多个文件的参数数量或内容,只需对每个文件重复上述解析和收集步骤:
- 统计数量:直接对比
len(text_params)的数值 - 对比内容:可将两个文件的
text_params转换成集合(仅保留值)或直接对比元组列表,找出参数差异
补充说明
你提到直接遍历根字典只能拿到顶层键,是因为Docker Compose的结构是多层嵌套的,必须通过递归遍历才能深入所有子节点,筛选出所有文本类型的自定义参数。
内容的提问来源于stack exchange,提问作者vrubayka
相关产品推荐
相关产品推荐

