迟钝 發表於 2019-11-20 20:19:00

Python中Pyyaml模块的使用

<p><span style="font-size: 16px"><strong>一、YAML是什么</strong></span></p>
<p>YAML是专门用来写<strong>配置文件</strong>的语言,远比JSON格式方便。</p>
<p>YAML语言的设计目标,就是方便人类读写。</p>
<p>YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表示结构,是不是听起来就和Python很搭?</p>
<p>顾名思义,用语言编写的文件就可以称之为YAML文件。PyYaml是Python的一个专门针对YAML文件操作的模块,使用起来非常简单</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">安装 pip install pyyaml   # 如果是py2,使用&nbsp;pip install yaml</span></pre>
</div>
<p><span style="font-size: 16px"><strong>二、PyYaml的简单使用</strong></span></p>
<p>使用起来非常简单,就像json、pickle一样,load、dump就足够我们使用了。</p>
<p>load()示例:返回一个对象</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml

yaml_str </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
name: 一条大河
age: 1956
job: Singer
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(0, 0, 0, 1)">

y </span>= yaml.load(yaml_str, Loader=<span style="color: rgba(0, 0, 0, 1)">yaml.SafeLoader)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(y)</span></pre>
</div>
<p>运行结果:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">一条大河</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span>: 1956, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">job</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Singer</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</span></pre>
</div>
<p>load_all()示例:生成一个迭代器</p>
<p>如果string或文件包含几块yaml文档,可以使用yaml.load_all来解析全部的文档。</p>
<p>yaml_test.yaml文件内容:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">---</span><br><span style="font-size: 14px">name: qiyu</span><br><span style="font-size: 14px">age: 20岁</span><br><span style="font-size: 14px">---</span><br><span style="font-size: 14px">name: qingqing</span><br><span style="font-size: 14px">age: 19岁</span></pre>
</div>
<p>操作yaml文件的test.py文件如下:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml

with open(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">./yaml_test</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">r</span><span style="color: rgba(128, 0, 0, 1)">'</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as ymlfile:
    cfg </span>= yaml.load_all(ymlfile, Loader=<span style="color: rgba(0, 0, 0, 1)">yaml.SafeLoader)
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> data <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> cfg:
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(data)</span></pre>
</div>
<p>运行结果:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">qiyu</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">20岁</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">qingqing</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">19岁</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</span></pre>
</div>
<p>dump()示例:将一个python对象生成为yaml文档</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml

json_data </span>= {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">一条大河</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
             </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span>: 1956<span style="color: rgba(0, 0, 0, 1)">,
             </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">job</span><span style="color: rgba(128, 0, 0, 1)">'</span>: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Singer</span><span style="color: rgba(128, 0, 0, 1)">','Dancer']</span><span style="color: rgba(0, 0, 0, 1)">}

y </span>= yaml.dump(json_data, default_flow_style=False).encode(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>).decode(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unicode_escape</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(y)</span></pre>
</div>
<p>运行结果:</p>
<div class="cnblogs_code">
<p><span style="font-size: 14px">age: 1956</span><br><span style="font-size: 14px">job:</span><br><span style="font-size: 14px">- Singer</span><br><span style="font-size: 14px">- Dancer</span><br><span style="font-size: 14px">name: "一条大河"</span></p>





</div>
<p>使用dump()传入参数,可以直接把内容写入到yaml文件:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml

json_data </span>= {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">一条大河</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
             </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">'</span>: 1956<span style="color: rgba(0, 0, 0, 1)">,
             </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">job</span><span style="color: rgba(128, 0, 0, 1)">'</span>: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Singer</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Dancer</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
with open(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./yaml_write.yaml</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">w</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as f:
    y </span>=<span style="color: rgba(0, 0, 0, 1)"> yaml.dump(json_data, f)
    </span><span style="color: rgba(0, 0, 255, 1)">print</span>(y)</span></pre>
</div>
<p>写入内容后的yaml_write.yaml:</p>
<p><img src="https://img2018.cnblogs.com/blog/907091/201911/907091-20191120145807326-1016307144.png" alt=""></p>
<p><span style="font-size: 14px">yaml.dump_all()示例:将多个段输出到一个文件中</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">import yaml</span><br><br><span style="font-size: 14px">obj1 = {"name": "river", "age": 2019}</span><br><span style="font-size: 14px">obj2 = ["Lily", 1956]</span><br><span style="font-size: 14px">obj3 = {"gang": "ben", "age": 1963}</span><br><span style="font-size: 14px">obj4 = ["Zhuqiyu", 1994]</span><br><br><span style="font-size: 14px">with open('./yaml_write_all.yaml', 'w', encoding='utf-8') as f:</span><br><span style="font-size: 14px">    y = yaml.dump(, f)</span><br><span style="font-size: 14px">    print(y)</span><br><br><span style="font-size: 14px">with open('./yaml_write_all.yaml', 'r') as r:</span><br><span style="font-size: 14px">    y1 = yaml.load(r, Loader=yaml.SafeLoader)</span><br><span style="font-size: 14px">    print(y1)</span></pre>
</div>
<p>写入内容后的yaml_write_all.yaml:</p>
<p><img src="https://img2018.cnblogs.com/blog/907091/201911/907091-20191120151026762-2090142303.png" alt=""></p>
<p>为什么写入文件后的格式有的带1个“-”,有的带2个“-”?</p>
<p>为什么yaml文件读出来的的格式是List?</p>
<p><span style="font-size: 16px"><strong>三、YAML的语法规则和数据结构</strong></span></p>
<p>看完了以上4个简单的示例,现在就来总结下YAML语言的基本语法</p>
<p><strong><strong>YAML&nbsp;</strong>基本语法规则如下:</strong></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">1<span style="color: rgba(0, 0, 0, 1)">、大小写敏感<br>
</span>2<span style="color: rgba(0, 0, 0, 1)">、使用缩进表示层级关系<br>
</span>3<span style="color: rgba(0, 0, 0, 1)">、缩进时不允许使用Tab键,只允许使用空格。<br>
</span>4<span style="color: rgba(0, 0, 0, 1)">、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可<br>
</span>5、<span style="color: rgba(0, 0, 0, 1)"># 表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样<br><br>6、列表里的项用"-"来代表,字典里的键值对用":"分隔</span></span></pre>
</div>
<p>知道了语法规则,现在来回答下上面的2个问题:</p>
<p>1、带1个“-”表示不同的模块(单个数组或者字典),带2个“-”是因为数组中元素以“-”开始,加上表示不同模块的那一个“-”,呈现出来就是2个“-”</p>
<p>2、因为yaml文件中包含多个模块(多个数组或者字典),读取出来的是这些模块的一个集合</p>
<p><strong>3、有且只有当yaml文件中只有1个字典时,读取出来的数据的类型也是字典</strong></p>
<p><strong>YAML 支持的数据结构有3种:</strong></p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">1、对象:键值对的集合2、数组:一组按次序排列的值,序列(sequence) 或 <span style="color: rgba(0, 0, 0, 1)">列表(list)

</span>3、纯量(scalars):单个的、不可再分的值,如:字符串、布尔值、整数、浮点数、Null、时间、日期</span></pre>
</div>
<p>支持数据示例:</p>
<p>yaml_test_data.yaml的内容:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">str: <span style="color: rgba(128, 0, 0, 1)">"Big River</span><span style="color: rgba(128, 0, 0, 1)">"</span>                           <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">字符串</span>
int: 1548                                 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">整数</span>
float: 3.14                               <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">浮点数</span>
boolean: true                              <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">布尔值</span>
None: null                              <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 也可以用 ~ 号来表示 null</span>
time: '2019-11-20T08:47:46.576701+00:00'       <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 时间,ISO8601</span> <br>date: 2019-11-20 16:47:46.576702                <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 日期</span></span></pre>
</div>
<p>操作代码:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> datetime
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> pytz

yaml_data </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">str</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Big River</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">int</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 1548<span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">float</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 3.14<span style="color: rgba(0, 0, 0, 1)">,
    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">boolean</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">: True,
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">None</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: None,
    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">time</span><span style="color: rgba(128, 0, 0, 1)">'</span>: datetime.datetime.now(tz=pytz.timezone(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTC</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)).isoformat(),
    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">date</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">: datetime.datetime.today()
}

with open(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./yaml_test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">w</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as f:
    y </span>=<span style="color: rgba(0, 0, 0, 1)"> yaml.dump(yaml_data, f)
    </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(y)

with open(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./yaml_test</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">r</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as r:
    y1 </span>= yaml.load(r, Loader=<span style="color: rgba(0, 0, 0, 1)">yaml.SafeLoader)
    </span><span style="color: rgba(0, 0, 255, 1)">print</span>(y1)</span></pre>
</div>
<p>控制台输出:</p>
<p><img src="https://img2018.cnblogs.com/blog/907091/201911/907091-20191120164949940-223748091.png" alt=""></p>
<p><strong>其他语法规则</strong></p>
<p>1、如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,就需要加引号了</p>
<p><img src="https://img2018.cnblogs.com/blog/907091/201911/907091-20191120171253107-1678044061.png" alt=""></p>
<p>2、引用</p>
<p>&amp; 和 * 用于引用</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">name: &amp;<span style="color: rgba(0, 0, 0, 1)">name SKP
tester: </span>*name</span></pre>
</div>
<p>运行结果:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SKP</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">tester</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">SKP</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</span></pre>
</div>
<p>3、强制转换</p>
<p>用 !! 实现</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">str: !!str 3.14<span style="color: rgba(0, 0, 0, 1)">
int: !!int </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">123</span><span style="color: rgba(128, 0, 0, 1)">"</span></span></pre>
</div>
<p>运行结果:</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px">{<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">int</span><span style="color: rgba(128, 0, 0, 1)">'</span>: 123, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">str</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">3.14</span><span style="color: rgba(128, 0, 0, 1)">'</span>}</span></pre>
</div>
<p>4、分段</p>
<p>在同一个yaml文件中,可以用“---”3个“-”来分段,这样可以将多个文档写在一个文件中</p>
<p>举例见上述load_all()示例</p>
<p><span style="font-size: 16px"><strong>四、</strong></span><span style="font-size: 16px"><strong>python对象生成yaml文档</strong></span></p>
<p>1、yaml.dump()方法</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os

</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> generate_yaml_doc(yaml_file):
    py_object </span>= {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">school</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">zhu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
               </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">students</span><span style="color: rgba(128, 0, 0, 1)">'</span>: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
    file </span>= open(yaml_file, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">w</span><span style="color: rgba(128, 0, 0, 1)">'</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    yaml.dump(py_object, file)
    file.close()

current_path </span>= os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
yaml_path </span>= os.path.join(current_path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">generate.yaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
generate_yaml_doc(yaml_path)
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">结果
school: zhu
students:
- a
- b
</span><span style="color: rgba(128, 0, 0, 1)">"""</span></span></pre>
</div>
<p>2、使用ruamel模块中的yaml方法生成标准的yaml文档</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os<br></span><span style="color: rgba(0, 0, 255, 1)">from</span> ruamel <span style="color: rgba(0, 0, 255, 1)">import</span> yaml   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> pip3 install ruamel.yaml</span>

<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> generate_yaml_doc_ruamel(yaml_file):
    py_object </span>= {<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">school</span><span style="color: rgba(128, 0, 0, 1)">'</span>: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">zhu</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
               </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">students</span><span style="color: rgba(128, 0, 0, 1)">'</span>: [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]}
    file </span>= open(yaml_file, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">w</span><span style="color: rgba(128, 0, 0, 1)">'</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    yaml.dump(py_object, file, Dumper</span>=<span style="color: rgba(0, 0, 0, 1)">yaml.RoundTripDumper)
    file.close()

current_path </span>= os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
yaml_path </span>= os.path.join(current_path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">generate.yaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
generate_yaml_doc_ruamel(yaml_path)
</span><span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">结果
school: zhu
students:
- a
- b
</span><span style="color: rgba(128, 0, 0, 1)">"""</span></span></pre>
</div>
<p>使用ruamel模块中的yaml方法读取yaml文档(用法与单独import yaml模块一致)</p>
<div class="cnblogs_code">
<pre><span style="font-size: 14px"><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os
</span><span style="color: rgba(0, 0, 255, 1)">from</span> ruamel <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> yaml

</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_yaml_data_ruamel(yaml_file):
    file </span>= open(yaml_file, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">r</span><span style="color: rgba(128, 0, 0, 1)">'</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    data </span>= yaml.load(file, Loader=<span style="color: rgba(0, 0, 0, 1)">yaml.Loader)
    file.close()
    </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(data)

current_path </span>= os.path.abspath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
yaml_path </span>= os.path.join(current_path, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">generate.yaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
get_yaml_data_ruamel(yaml_path)</span></span></pre>
</div><br><br>
来源:https://www.cnblogs.com/ailiailan/p/11850857.html
頁: [1]
查看完整版本: Python中Pyyaml模块的使用