Python之ruamel.yaml模块详解(一)
2023-06-13 09:17:08 时间
1 ruamel.yaml简介
ruamel.yaml
是一个yaml
解析器;ruamel.yaml
是一个用于Python
的yaml1.2
加载器/转储程序包;- 它是
PyYAML 3.11
的衍生产品; ruamel.yaml
库继承子PyMYAL
库,读写方法基本相同,目前来说可以根据自己的习惯选择使用ruamel.yaml
还是PyMYAL
进行yaml
文件的读写操作。
2 ruamel.yaml安装
- 前提条件是:确保安装了最新版本的
pip
和setuptools(>=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 fileinput_Python之fileinput模块学习「建议收藏」
- 怎么用python打开csv文件_Python文本处理之csv-csv文件怎么打开[通俗易懂]
- python生成器详解_Python 生成器
- Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法[通俗易懂]
- 【说站】Python不同模块下特殊变量的使用
- 【说站】python如何为函数和模块起别名
- python的tkinter模块的导入_numpy scipy
- python定义函数求和_Python定义函数实现累计求和操作
- Python正则表达式模块:re
- Python 常用外部模块详解
- Ubuntu18.04 一键升级Python所有第三方包 及安装python包的方法
- python AES算法模块进行加密解密的代码片段详解编程语言
- python通过MySQLdb模块连接查询mysql数据详解编程语言
- python多线程模块threading使用范例代码详解编程语言
- Python常用内建模块——学习笔记详解编程语言
- Python 自定义模块导入详解编程语言
- 小白的Python之路 day5 python模块详解及import本质编程语言
- python_Day38_多进程和multiprocess模块1详解编程语言
- python模块之configparser详解编程语言
- python之os模块详解编程语言
- Linux系统下安装Python模块指南(linux安装python模块)
- python多进程通信模块的简单实现
- Python动态加载模块的3种方法
- Python中itertools模块用法详解