python读取/写入配置文件.yaml如此简单

本文介绍了YAML的用途,如配置文件和测试用例的编写,并讲解了其基本规则和数据结构。通过Python的pyyaml库,展示了如何读取和写入YAML文件,包括读取日志配置及写入token信息。
部署运行你感兴趣的模型镜像

python读取配置文件.yaml

认识yaml

yaml是一种简洁的非标记语言。

yaml用途

1、配置文件

  • 比如对环境的配置,测试环境的url 和生产环境的url
  • 对日志的处理:日志的文件名称,日志的级别,日志的输出格式
  • 测试报告的文件名称
  • 数据库的信息
    ⚠️只要是全局的数据,都会放入配置文件中

2、写测试用例(接口自动化用于数据驱动)

yaml的基本规则

  • 区分大小写
  • 禁止使用缩进表示层级关系
  • 禁止使用tab键缩进,用空格键缩进
  • 缩进没有长度限制,但要与元素对齐
  • 注释符号为:#
  • 字符串可以不用引号标注

yaml的三种数据结构

  • 字典
    例如:{“username”:“root”,“password”:123456}
    在yaml文件中可以这样写:
    username:rootpassword:123455
    字典嵌套字典的写法:
    在这里插入图片描述
  • 列表
    例如:[‘username’, ‘password’]
    yaml文件的写发法:
    在这里插入图片描述
  • scalar,纯量
    yaml与json数据结构对比:
    json:
    map对象:键值对
    数组:[]
    yaml:
    map对象:键:(空格)值对;一行的写法:mysql: {name: root, pwd: 123}
    列表:
    在这里插入图片描述
    一行的写法:mysql: [{name: root},{pwd: 123}]
    推荐验证json还是yaml的网站:https://www.bejson.com/
    安装第三方插件:pyyaml
    方法:yaml.load(文件)

读取yaml

 class ReadConfig:
		def __init__(self,filename):
    		self.filename=filename
		def read_yaml(self):
   		    with open(self.filename, encoding='utf-8') as fs:
        #避免报警告:yaml.FullLoader
            data = yaml.load(fs, yaml.FullLoader)
            print(data["log"])

写入yaml

def write_yaml(self):
    #写入token  token: 123456
    with open(self.filename,'w', encoding='utf-8') as fs:
        token={"token":"123456"}
        #写入中文:allow_unicode=True
        yaml.dump(token,stream=fs,allow_unicode=True)

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户的问题是要将两个YAML文件(add_role.yaml和login.yaml)中的steps合并,并生成新的YAML文件,同时处理可能的嵌套引用情况。首先,我需要理解用户的需求。他们可能在自动化部署或者持续集成/持续部署(CI/CD)中使用GitHub Actions或其他工具,需要合并多个工作流中的步骤,以减少冗余或简化流程。 接下来,我需要考虑如何处理YAML文件的解析。YAML是一种结构化数据格式,通常用字典和列表表示。Python中的PyYAML库可以解析和生成YAML文件,所以可能需要用这个库来读取两个文件的内容,提取steps字段,然后合并。 但用户提到需要处理嵌套引用的情况,这意味着add_role.yaml可能通过某种方式引用了login.yaml中的内容,比如使用YAML的锚点(&)和别名(*),或者通过文件包含的指令。这时候,解析的时候需要识别这些引用,并正确地将被引用的文件中的steps也包含进来。 首先,我需要解析add_role.yaml,检查是否有引用其他文件的语法。例如,可能在steps部分有一个包含语句,如$ref: 'login.yaml',或者使用YAML的合并键<<: *某个锚点。如果是这种情况,就需要递归地解析被引用的文件,直到所有嵌套的引用都被处理完毕。 假设用户使用的是类似$ref的语法来引用其他文件中的步骤,那么处理过程需要: 1. 解析主文件(add_role.yaml),找到所有引用其他文件的地方。 2. 加载被引用的文件(如login.yaml),提取其中的steps。 3. 递归处理被引用文件中可能存在的其他引用。 4. 将所有提取到的steps合并到一个列表中,保持顺序或按需排序。 5. 生成新的YAML文件,包含合并后的steps。 需要注意的是,合并步骤时可能会存在重复的步骤,或者步骤之间的依赖关系,需要用户决定如何处理重复项,比如去重或者保留所有步骤。此外,YAML中的锚点和别名处理也需要特别小心,避免解析错误。 可能的解决方案步骤: 1. 使用PyYAML加载add_role.yaml,并检查其steps字段。 2. 对于每个步骤,检查是否有引用其他文件的标识(如$ref)。 3. 如果有引用,加载对应的YAML文件,递归解析其steps。 4. 将本地的steps和引用的steps合并到一个列表。 5. 处理完所有引用后,生成新的YAML文件,写入合并后的steps。 另外,用户可能需要处理文件路径的问题,比如被引用的login.yaml是否在同一个目录,或者需要指定相对路径。解析时需要正确找到被引用文件的位置。 测试方面,需要考虑不同嵌套情况,例如多级引用,循环引用等,确保程序能正确处理这些情况而不会陷入死循环或崩溃。 总结来说,关键点在于解析YAML文件中的引用,递归处理嵌套结构,正确合并steps字段,并生成新的文件。需要用到PyYAML库,并编递归解析函数来处理引用。</think>### 分步解决方案 要合并两个YAML文件的`steps`字段并处理嵌套引用,可通过以下步骤实现: 1. **安装依赖库** ```bash pip install pyyaml ``` 2. **创建引用解析函数** ```python import yaml import os def load_yaml_with_ref(file_path): with open(file_path, 'r') as f: data = yaml.safe_load(f) if 'steps' in data: resolved_steps = [] for step in data['steps']: if '$ref' in step: # 处理引用语法 ref_path = os.path.join(os.path.dirname(file_path), step['$ref']) ref_data = load_yaml_with_ref(ref_path) resolved_steps.extend(ref_data['steps']) else: resolved_steps.append(step) data['steps'] = resolved_steps return data ``` 3. **合并处理主逻辑** ```python def merge_yaml_steps(main_file, output_file): main_data = load_yaml_with_ref(main_file) merged_steps = main_data['steps'] # 输出合并后的YAML文件 output_data = {'steps': merged_steps} with open(output_file, 'w') as f: yaml.dump(output_data, f, sort_keys=False) ``` 4. **执行合并操作** ```python merge_yaml_steps('add_role.yaml', 'merged_steps.yaml') ``` ### 关键点说明 - **嵌套引用处理**:通过递归解析`$ref`标记实现多级文件引用,例如: ```yaml # add_role.yaml片段 steps: - name: Login $ref: "login.yaml" - name: Add role run: "echo 'Adding role...'" ``` - **路径处理**:使用`os.path.dirname()`确保相对路径正确解析 - **格式保留**:`sort_keys=False`保持原有字段顺序[^2] ### 测试验证 在`login.yaml`包含: ```yaml steps: - name: Auth check run: "echo 'Checking auth...'" ``` 合并后的`merged_steps.yaml`将包含: ```yaml steps: - name: Auth check run: "echo 'Checking auth...'" - name: Add role run: "echo 'Adding role...'" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑娘别秃头

你的鼓励是为我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值