zoukankan      html  css  js  c++  java
  • python常识系列03-->python读取YAML文件

    前言

         书是灵魂最好的麻醉剂。——钱伯斯
         我觉得可以把第一个书改为技术!
    

    一、python读取YAML文件步骤

    1. 安装 pyyaml 模块 :pip install pyyaml
    2. 编写代码

    二、pyyaml 模块应用

    • 2.1 读取YAML文件基础
    #存在 test.yml 文件,内容如下:
    name: xiaohong
    age: 24
    books:
      - 呐喊
      - 朝花夕拾
    

    读取YAML代码如下:

    import yaml
    
    file = open('test.yaml', 'r', encoding="utf-8")
    #使用文件对象作为参数
    data = yaml.load(file)      
    print(data)
    

    以上代码执行结果如下:

    /usr/local/bin/python3.8 /Users/lanyin/PycharmProjects/newdream/app_demo/blog_demo/test_demo_02.py
    {'name': 'xiaohong', 'age': 24, 'books': ['呐喊', '朝花夕拾']}
    类型: <class 'dict'>
    /Users/lanyin/PycharmProjects/newdream/app_demo/blog_demo/test_demo_02.py:6: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
      data = yaml.load(file)
    
    Process finished with exit code 0
    

    会出现警告,原因是YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载​​器(FullLoader)禁止执行任意函数,该load函数也变得更加安全。建议代码如下:

    import yaml
    
    file = open('test.yaml', 'r', encoding="utf-8")
    #读取文件中的所有数据
    file_data = file.read()                 
    file.close()
    
    #指定Loader
    data = yaml.load(file_data,Loader=yaml.FullLoader)    
    print(data)
    
    • 上述例子和之前的例子我用了两种不同的读取方式,第一种为文件对象,第二种为文件中的所有字符串数据,两种方法都可以;
    • 同时大家也发现了:yaml读取出来的数据结构不是由pyyaml模块读取代码决定的,而是yaml文件中的内容决定了它的结构,比如现在举例的YAML是字典里面嵌套列表,从文件读取出来后,也是这种数据结构形式
    • 2.2 load_all() 方法应用
    #存在 test.yml 文件,内容如下:
    ---
    name: xiaoli
    age: 22
    ---
    name: xiaohuang
    age: 21
    

    load_all()方法使用代码如下:

    import yaml
    file = open('test.yaml', 'r', encoding="utf-8")
    #datas为load_all()方法返回的迭代器对象
    datas = yaml.load_all(file,Loader=yaml.FullLoader)  
    for data in datas:  
        print(data)
    

    本例中的YAML文件使用 --- 分为两段,load_all()方法会创建一个迭代器对象,分开存放两段数据。

    • 2.3 使用dump()方法将一个python对象生成为yaml格式的数据
    import yaml
    data = { 'name':'xiaowang', 'age':30 , 'sex':'男' }
    data_yaml = yaml.dump(data).encode('utf-8').decode('unicode_escape')
    print(data_yaml)
    

    以上示例中.encode('utf-8').decode('unicode_escape') 是先编码为'utf-8',然后解码(或称为反编码)成汉字。大家如对此不熟悉,可以逐个去掉.encode('utf-8').decode('unicode_escape') 看显示效果。

    • 2.4 使用dump()方法将一个python对象生成yaml格式的文档
    import yaml
    data = { 'name':'xiaowang', 'age':30 , 'sex':'男' }
    yaml_file = open('test.yaml','w')
    
    #yaml_file作为dump()第二个参数,是一个可写状态的文件对象
    yaml.dump(data, yaml_file ,default_flow_style=False,encoding='utf-8',allow_unicode=True)
    yaml_file.flush()
    yaml_file.close()
    
    • 上例中dump()因为要完成写入文件操作,所以需要一个可写状态的文件对象作为参数
    • 上述例子会在当前文件目录生成一个test.yaml文件,其中dump()中的其它三个参数不要问,问就是解决中文编码问题,不信你不写试试。
  • 相关阅读:
    Genealogical tree(拓扑结构+邻接表+优先队列)
    确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)
    Agri-Net
    Network()
    Conscription
    Matrix(类似kruskal)
    Highways(求最小生成树的最大边)
    Shell学习之Shell特性(一)
    Linux学习之用户管理命令与用户组管理命令(十五)
    Linux学习之用户配置文件详解(十四)
  • 原文地址:https://www.cnblogs.com/dream66/p/12549248.html
Copyright © 2011-2022 走看看