yaml文件读取及使用

安装:

pip install pyyaml

在yaml.load方法中,’loader’参数有四种:

BaseLoader:载入大部分的基础YAML
SafeLoader:载入YAML的子集,推荐在不可信的输入时使用
FullLoader:这是默认的载入方式,载入全部YAML
UnsafeLoader:老版本的载入方式

yaml文件的读写:

yaml_dict = {
   	"user":"general",
   	"country":"China",
   	"gender":"male",
   	"address":"北京"
}
with open (os.path.join(yaml_dir,file_name),'w',encoding='utf-8') as f:
    yaml.dump(yaml_dict,f)

尽管在写文件时指定了编码为utf-8,但查看文件内容时中文还是不能正常显示。但是不影响读取。

with open (yaml_file,'r',encoding='utf-8') as f:
    yaml_dict = yaml.load(f,Loader=yaml.FullLoader)
    print(yaml_dict["user"])
    print(yaml_dict["address"])

在实际使用的时候可以配合,输入参数更新配置文件中的参数使用:

def merge_config(config,args):
    for key_1 in config.keys():
        if(isinstance(config[key_1],dict)):
            for key_2 in config[key_1].keys():
                if(key_2) in dir(args):
                    config[key_1][key_2] = getattr(args,key_2)
    return config

config = yaml.load(open(args.config, 'r', encoding='utf-8'),Loader=yaml.FullLoader)
config = merge_config(config,args)

 

### 如何使用 `yaml-cpp` 库读取 YAML 文件 以下是关于如何使用 `yaml-cpp` 库来读取 YAML 文件的具体方法以及示例代码。 #### 安装 `yaml-cpp` 在开始之前,确保已经安装了 `yaml-cpp` 库。可以通过以下命令安装: ```bash sudo apt-get install libyaml-cpp-dev ``` 或者通过源码编译安装: ```bash git clone https://github.com/jbeder/yaml-cpp.git cd yaml-cpp mkdir build && cd build cmake .. make sudo make install ``` --- #### 使用 `yaml-cpp` 读取 YAML 文件的流程 1. **加载文件**:通过 `YAML::LoadFile()` 函数加载指定路径的 YAML 文件。 2. **解析节点**:获取根节点并逐层访问子节点。 3. **提取数据**:根据键名提取对应的值。 下面是一个完整的 C++ 示例程序,展示如何使用 `yaml-cpp` 来读取 YAML 文件中的内容[^4]。 --- #### 示例代码 假设有一个名为 `example.yaml` 的文件,内容如下: ```yaml name: John Doe age: 30 address: street: Main Street number: 123 city: New York hobbies: - reading - hiking - coding ``` 下面是实现读取文件的 C++ 程序: ```cpp #include <iostream> #include <yaml-cpp/yaml.h> int main() { try { // 加载 YAML 文件 YAML::Node config = YAML::LoadFile("example.yaml"); // 提取基本字段 std::string name = config["name"].as<std::string>(); int age = config["age"].as<int>(); // 输出基本信息 std::cout << "Name: " << name << "\n"; std::cout << "Age: " << age << "\n"; // 访问嵌套结构 (地址信息) if (config["address"]) { // 检查是否存在 address 字段 std::string street = config["address"]["street"].as<std::string>(); int number = config["address"]["number"].as<int>(); std::string city = config["address"]["city"].as<std::string>(); std::cout << "Address:\n" << "Street: " << street << "\n" << "Number: " << number << "\n" << "City: " << city << "\n"; } // 遍历列表 (爱好) const YAML::Node hobbies = config["hobbies"]; if (hobbies.IsSequence()) { std::cout << "Hobbies:" << "\n"; for (unsigned i = 0; i < hobbies.size(); ++i) { std::cout << "- " << hobbies[i].as<std::string>() << "\n"; } } } catch (const YAML::Exception& e) { std::cerr << "Error while parsing YAML file: " << e.what() << "\n"; } return 0; } ``` --- #### 关键点说明 1. **异常处理**:由于可能遇到文件不存在或格式错误的情况,建议始终捕获 `YAML::Exception` 并进行适当处理[^5]。 2. **类型转换**:`yaml-cpp` 支持多种类型的自动转换(如字符串、整数、浮点数等),但如果类型不匹配会抛出异常。 3. **嵌套结构支持**:可以轻松访问多层次嵌套的数据结构。 4. **序列遍历**:对于数组或列表形式的数据,可通过 `.IsSequence()` 判断是否为序列,并逐一访问其中的元素。 --- ### 总结 以上展示了如何利用 `yaml-cpp` 库读取 YAML 文件的内容,并提供了详细的代码示例和解释。此方法适用于各种复杂度的 YAML 数据结构,能够满足大多数场景需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值