Python读写yaml排版混乱还丢失注释?我来告诉你解决办法!

简介: 日常我们在使用Python读写Yaml时,都是使用推荐的Pyyaml模块。安装: pip install pyyaml导入: import yaml至于操作,简直不要太简单... yaml只有两个方法load、dump,而且使用完全和json模块一样。但真的如此吗?显然不是...

Python使用Yaml


日常我们在使用Python读写Yaml时,都是使用推荐的Pyyaml模块。

安装: pip install pyyaml

导入: import yaml

至于操作,简直不要太简单... yaml只有两个方法load、dump,而且使用完全和json模块一样。但真的如此吗?显然不是...


Yaml安全告警


由于Yaml数据存在安全隐患,在使用pyyaml进行load时,会给出提示:

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please

read https://msg.pyyaml.org/load for full details.

所以我们有以下方式解决:

  • 添加Loader
    info = yaml.load(data,Loader=yaml.SafeLoader)
  • 使用语法糖
    info = yaml.safe_load(data)

同时pyyaml支持多段yaml内容的文本读写功能,即load_all() dump_all()。当我们使用safe_load获取多节点yaml文件时,会出发yaml.composer.ComposerError的错误,所以更优雅的导入方式应该是:

import yaml
from yaml.composer import ComposerError
with open(file, 'r') as f:
    data = f.read()
try:
    return yaml.safe_load(data)
except ComposerError:
    return yaml.safe_load_all(data)

要注意,load_all 返回的是一个generator。当然用了这么久yaml真的很少见多段yaml非要写在一个文件中的情况。


pyyaml的劣势


上面介绍的主要是pyyaml的读取功能,可是在pyyaml将读取后的内容进行二次写入时,你就会遇到很多的问题,比如:

  1. 原本的yaml文件字段顺序,被重新调整
  2. 所有的注释内容,全部丢失

顺序这个勉强还可以容忍,但是注释全部丢失真的是叔叔能忍,婶婶都忍不啊!让我们看一个yaml文件读写前后对比:


网络异常,图片无法展示
|

yaml读写前后对比

我们该如何解决这个问题呢?


ruamel.yaml


ruamel.yaml作为pyyaml的衍生版,在继承了传统pyyaml的基础上,增加了RoundTrip模式。在读取yaml的时候,将yaml转化为ordereddict。众所周知,collections中的ordereddict是一个有序的字典,这样就保证了我们yaml读写后的顺序一致。

安装: pip install ruamel.yaml

导入: from ruamel import yaml

来看看效果吧:

from ruamel import yaml
class YamlLoader:
    def __init__(self, file):
        self.file = file
    def file_load(self):
        with open(self.file, 'r', encoding='utf-8') as f:
            data = f.read()
        return yaml.load(data, Loader=yaml.RoundTripLoader)
    def file_dump(self, data):
        with open('newer_%s' % self.file, 'w',
                  encoding='utf-8') as f:
            yaml.dump(data, f,
                      Dumper=yaml.RoundTripDumper)
yml = YamlLoader('single.yaml')
yaml_info = yml.file_load()
print(yaml_info)
yml.file_dump(yaml_info)
output:
ordereddict([('Users', [ordereddict([('Lilei', ordereddict([('age', 18), ('sex', 'male')]))]), ordereddict([('Hanmeimei', ordereddict([('age', 17), ('sex', 'female')]))])]), ('Code', ['Python', 'Java', 'Ruby'])])

网络异常,图片无法展示
|

ruamel.yaml效果

今天的分享就到这里,希望对大家有所帮助。如果有收获,记得转发+点再看支持下,谢谢。


The End



相关文章
|
10天前
|
数据挖掘 Python
🚀告别繁琐!Python I/O管理实战,文件读写效率飙升的秘密
在日常编程中,高效的文件I/O管理对提升程序性能至关重要。Python通过内置的`open`函数及丰富的库简化了文件读写操作。本文从基本的文件读写入手,介绍了使用`with`语句自动管理文件、批量读写以减少I/O次数、调整缓冲区大小、选择合适编码格式以及利用第三方库(如pandas和numpy)等技巧,帮助你显著提升文件处理效率,让编程工作更加高效便捷。
26 0
|
1天前
|
Python
7-9|Python如何安装ruamel.yaml
7-9|Python如何安装ruamel.yaml
|
3天前
|
IDE 开发工具 Python
python3代码编程规范(命名、空格、注释、代码布局、编程建议等)
该文章详细介绍了Python3的编程规范,包括命名、空格使用、注释、代码布局等方面的最佳实践,帮助提升代码的可读性和一致性。
11 0
|
1月前
|
SQL JSON 关系型数据库
n种方式教你用python读写excel等数据文件
n种方式教你用python读写excel等数据文件
|
30天前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
37 0
|
1月前
|
Python
python中注释使用连续的单行注释 #
【8月更文挑战第1天】
20 6
|
2月前
|
开发者 Python
Python中注释用途
【7月更文挑战第28天】
23 6
|
1月前
|
IDE API 开发工具
|
1月前
|
Python
python中注释使用三个引号 """ 或 '''
【8月更文挑战第1天】
144 4
|
2月前
|
开发者 Python
Python 基础语法注释
【7月更文挑战第27天】
34 6