python之ruamel.yaml模块详解(代码片段)

虫无涯 虫无涯     2023-02-27     754

关键词:

Python之ruamel.yaml模块详解(一)

1 ruamel.yaml简介

  • ruamel.yaml是一个yaml解析器;
  • ruamel.yaml是一个用于Pythonyaml1.2加载器/转储程序包;
  • 它是PyYAML 3.11的衍生产品;
  • ruamel.yaml库继承子PyMYAL库,读写方法基本相同,目前来说可以根据自己的习惯选择使用 ruamel.yaml 还是 PyMYAL 进行yaml文件的读写操作。

2 ruamel.yaml安装

  • 前提条件是:确保安装了最新版本的pipsetuptools(>=20.6.8)

2.1 setuptools安装

pip install -U pip setuptools wheel

2.2 pip安装ruamel.yaml

  • 一般情况安装到这就可以了,后续的2.3和2.4仅供参考使用。
pip install ruamel.yaml
C:\\Users\\Administrator>pip install ruamel.yaml
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting ruamel.yaml
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/9e/cb/938214ac358fbef7058343b3765c79a1b7ed0c366f7f992ce7ff38335652/ruamel.yaml-0.17.21-py3-none-any.whl (109 kB)
     --------------------------------------- 109.5/109.5 kB 2.1 MB/s eta 0:00:00

Collecting ruamel.yaml.clib>=0.2.6
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/da/f4/928e950925fe1b9eb048ddab8eef073a52e9ae01afd06f98f1daf743e355/ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl (115 kB)
     ------------------------------------- 115.9/115.9 kB 357.0 kB/s eta 0:00:00

Installing collected packages: ruamel.yaml.clib, ruamel.yaml
Successfully installed ruamel.yaml-0.17.21 ruamel.yaml.clib-0.2.7

2.3 处理jinja2/YAML模板

pip install ruamel.yaml[jinja2]

2.4 yaml命令行实用程序

pip install ruamel.yaml.cmd

3 yaml.load()和yaml.dump()解析

3.1 yaml.load()读ymal文件

from ruamel.yaml import YAML

yaml=YAML(typ='safe')   
yaml.load(doc)
  • 以上typ若没有指定,默认为 'rt' (round-trip)
  • doc可以是文件指针(即具有.read()方法、字符串或pathlib.Path()的对象);
  • typ='safe'完成了与safe_load()之前相同的操作:加载文档而不解析未知标记;
  • pure=True以使用纯Python实现强制执行,否则将在可能/可用时使用更快的C库。
  • 详细的可以参考源码:
class YAML:
    def __init__(self, *, typ=None, pure=False, output=None, plug_ins=None):  # input=None,
        # type: (Any, Optional[Text], Any, Any, Any) -> None
        """
        typ: 'rt'/None -> RoundTripLoader/RoundTripDumper,  (default)
             'safe'    -> SafeLoader/SafeDumper,
             'unsafe'  -> normal/unsafe Loader/Dumper
             'base'    -> baseloader
        pure: if True only use Python modules
        input/output: needed to work as context manager
        plug_ins: a list of plug-in files
        """
    def load(self, stream):
        # type: (Union[Path, StreamTextType]) -> Any
        """
        at this point you either have the non-pure Parser (which has its own reader and
        scanner) or you have the pure Parser.
        If the pure Parser is set, then set the Reader and Scanner, if not already set.
        If either the Scanner or Reader are set, you cannot use the non-pure Parser,
            so reset it to the pure parser and set the Reader resp. Scanner if necessary
        """
        if not hasattr(stream, 'read') and hasattr(stream, 'open'):
            # pathlib.Path() instance
            with stream.open('rb') as fp:
                return self.load(fp)
        constructor, parser = self.get_constructor_parser(stream)
        try:
            return constructor.get_single_data()
        finally:
            parser.dispose()
            try:
                self._reader.reset_reader()
            except AttributeError:
                pass
            try:
                self._scanner.reset_scanner()
            except AttributeError:
                pass

3.2 yaml.dump()写ymal文件

from ruamel.yaml import YAML

yaml=YAML()
yaml.default_flow_style = False
yaml.dump('a': [1, 2], s)
  • 方式和load差不多;
  • s可以是文件指针(即,具有.write()方法的对象,或pathlib.Path()。如果要显示输出,只需sys.stdout即可;
  • 如果需要转换输出的字符串表示形式,请提供一个将字符串作为输入并返回一个字符串的函数:
def tr(s):
    return s.replace('\\n', '<\\n')  # such output is not valid YAML!

yaml.dump(data, sys.stdout, transform=tr)
  • 详细查看源码:
 def dump(self, data, stream=None, *, transform=None):
        # type: (Any, Union[Path, StreamType], Any, Any) -> Any
        if self._context_manager:
            if not self._output:
                raise TypeError('Missing output stream while dumping from context manager')
            if transform is not None:
                raise TypeError(
                    '.dump() in the context manager cannot have transform keyword '
                    ''.format(self.__class__.__name__)
                )
            self._context_manager.dump(data)
        else:  # old style
            if stream is None:
                raise TypeError('Need a stream argument when not dumping from context manager')
            return self.dump_all([data], stream, transform=transform)

3.3 基于C的SafeLoader

from ruamel.yaml import YAML

yaml=YAML(typ="safe")
yaml.load("""a:\\n  b: 2\\n  c: 3\\n""")

3.4 基于Python的SafeLoader

from ruamel.yaml import YAML

yaml=YAML(typ="safe", pure=True)
yaml.load("""a:\\n  b: 2\\n  c: 3\\n""")

python之ruamel.yaml模块详解|ruamel.yaml与pyyaml的区别(代码片段)

Python之ruamel.yaml模块详解(三)|ruamel.yaml与pyyaml的区别12默认支持Yaml1.213Py2和Py3重新整合14修复15测试16API接前文:Python之ruamel.yaml模块详解(一);Python之ruamel.yaml模块详解(二);注:以下... 查看详情

Conda 'ImportError:没有名为 ruamel.yaml.comments 的模块'

】Conda\\\'ImportError:没有名为ruamel.yaml.comments的模块\\\'【英文标题】:Conda\'ImportError:Nomodulenamedruamel.yaml.comments\'Conda\'ImportError:没有名为ruamel.yaml.comments的模块\'【发布时间】:2017-05-1310:22:41【问题描述】:当我用它运行任何命令... 查看详情

如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?

】如何在Python中使用ruamel.yaml从YAML文件中获取注释?【英文标题】:HowcanIgetcommentsfromaYAMLfileusingruamel.yamlinPython?【发布时间】:2016-11-1004:29:54【问题描述】:我想从使用ruamel.yaml加载的YAML文件中获取注释字符串。projectdocumentation... 查看详情

python ruamel.yaml 包,如何获取标题注释行?

】pythonruamel.yaml包,如何获取标题注释行?【英文标题】:pythonruamel.yamlpackage,howtogetheadercommentlines?【发布时间】:2022-01-1401:25:59【问题描述】:我想在标题行获取YAML文件cmets,例如#11111111111111111#11111111111111111#22222222222222222#bbbbbbbb... 查看详情

使用 ruamel.yaml 修改 YAML 会添加额外的新行

】使用ruamel.yaml修改YAML会添加额外的新行【英文标题】:ModifyingYAMLusingruamel.yamladdsextranewlines【发布时间】:2017-06-2913:40:43【问题描述】:我需要为YAML文件中的现有键添加一个额外的值。以下是我正在使用的代码。withopen(yaml_in_pa... 查看详情

python标准库datetime之date模块详解(代码片段)

Python标准库datetime之date模块详解datetime是Python提供的操作日期和时间的标准库,主要有datetime.date模块、datetime.time模块及datetime.datetime模块。其中date模块提供了日期操作相关的方法;time模块提供了时间操作相关的方法;datetime提... 查看详情

通过 ruamel.yaml 转储时如何在 yaml 文件中保留空值

】通过ruamel.yaml转储时如何在yaml文件中保留空值【英文标题】:howtokeepnullvalueinyamlfilewhiledumpingthoughruamel.yaml【发布时间】:2017-11-0223:36:07【问题描述】:我有YAML文件site.yaml:Kvm_BLOCK:ip_address:10.X.X.Xproperty:nullserver_type:zone加载然后转... 查看详情

在 ruamel.yaml 中保留引号

】在ruamel.yaml中保留引号【英文标题】:Preservingquotesinruamel.yaml【发布时间】:2017-06-2423:27:43【问题描述】:我正在使用ruamel.yaml来修改YAML文件。我的要求是为现有密钥添加一个值,保留包括订单在内的所有其他内容。我让它工... 查看详情

在python中安装yaml(代码片段)

InstallYAMLinPython|DelftStack:https://www.delftstack.com/howto/python/pip-install-yaml/PyYAMLDocumentation:https://pyyaml.org/wiki/PyYAMLDocumentation1.流程1.1.更新pip并安装setuptools#pythonpipinstall-Upipsetuptoolswheel1.2.安装ruamel.yaml#pythonpipinstallruamel.yaml1.3.安装PyYaml#python... 查看详情

如何配置 ruamel.yaml.dump 输出?

】如何配置ruamel.yaml.dump输出?【英文标题】:Howtoconfigureruamel.yaml.dumpoutput?【发布时间】:2017-01-2811:30:24【问题描述】:有了这个数据结构:d=(2,3,4):\'a\':[1,2],\'b\':\'HelloWorld!\',\'c\':\'Voilà!\'我想要这个YAML:%YAML1.2---[2,3,4]:a:-1-2b:Hello... 查看详情

防止长行被包裹在 ruamel.yaml

】防止长行被包裹在ruamel.yaml【英文标题】:Preventlonglinesgettingwrappedinruamel.yaml【发布时间】:2017-06-2911:17:04【问题描述】:我使用load_yaml_guess_indent(f,preserve_quotes=True)读取YAML文件,然后对其进行修改并将其写回。我注意到当它们... 查看详情

python标准库datetime之time模块详解(代码片段)

Python标准库datetime之time模块详解上一篇博文中我们学习了datetime库中的日期模块(date),本文我们来学习下时间模块(time)。传送门:点击即可跳转日期模块1、时间对象类主要处理时、分、秒操作创建对象常用的参数有(小时,分钟,秒... 查看详情

python之configparser模块详解和使用(代码片段)

...安装pip3installconfigparser2configparser简介用来读取配置文件的python包;一般做自动化测试的时候,会使用到这个模块,用来封装一些常量。比如数据库、邮件、用户名密码、项目常量等等;这个使用根据个人喜好和项目来确定,不一... 查看详情

python标准库datetime之datetime模块详解(代码片段)

Python标准库datetime之datetime模块详解1、日期时间对象日期时间对象是指具有日期(年月日)和时间(时分秒)双重属性的实例日期时间对象的类型为datetime.datetime日期时间对象常用的属性有年、月、日、时、分、秒、微秒日期时间对象... 查看详情

python操作excel之xlrdxlwt模块详解(代码片段)

python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel.python读excel——xlrd这个过程有几个比较麻烦的问题,比如读取日期、读合并单... 查看详情

python时间序列之datetime模块详解(代码片段)

...者:Peter编辑:Peter大家好,我是Peter~在上篇Python时间序列的文章中Peter详细介绍了time模块,本文中重点介绍的是datetime模块。这个模块可以说是time模块的升级版本,使用的情况更为普遍和常见,用法也更... 查看详情

我可以在 ruamel.yaml 的 CommentedMap 中插入一行吗?

】我可以在ruamel.yaml的CommentedMap中插入一行吗?【英文标题】:CanIinsertalineintoruamel.yaml\'sCommentedMap?【发布时间】:2016-08-2611:20:29【问题描述】:我知道这与thisSOquestion有关,但我最担心的是这是否会与保存的cmets等东西混淆。impor... 查看详情

如何使用显式引用转储 YAML?

...【发布时间】:2017-01-2420:05:23【问题描述】:递归引用在ruamel.yaml或pyyaml中效果很好:$ruamel.yaml.dump(ruamel.yaml.load(\'&A[*A]\'))\'&id001-*id001\'但是它(显然)不适用于普通引用:$ruamel.yaml 查看详情