YAML是一种轻型的配置文件的语言,远比JSON格式方便,方便人类读写,它通过缩进来表示结构,很具有Python风格。

安装:pip insall pyyaml

YAML语法

  • 文档

YAML数据流是0个或者多个文档,文档之间用---分割,文档可选用...结束,单个文档可用也可不用---开头。

隐式文档如下:

"""
- Multimedia
- Internet
- Education
"""
'\n- Multimedia\n- Internet\n- Education\n'

显式文档如下:

"""
---
- Multimedia
- Internet
- Education
...
"""
'\n---\n- Multimedia\n- Internet\n- Education\n...\n'
  • 序列

序列用-空格来表示

yaml.load("""
- The Dagger
- The daager
- The Daaage
""")
['The Dagger', 'The daager', 'The Daaage']

序列可以嵌套:

yaml.load("""
-
- HTML
- LaTex
- XML
- VRML
- YAML
-
- BSD
- GNU HURD
- LINUX
""")
[['HTML', 'LaTex', 'XML', 'VRML', 'YAML'], ['BSD', 'GNU HURD', 'LINUX']]

也可不用另起一行来新建嵌套的序列:

yaml.load("""
- 1.1
- - 2.1
- 2.2
- - - 3.1
- 3.2
- 3.3 """)
[1.1, [2.1, 2.2], [[3.1, 3.2, 3.3]]]

序列也可以嵌套到映射中:

yaml.load("""
left hand:
- Ring of Tesla
- Ring of King
right hand:
- Ring of Asia
- Ring of Cold
""")
{'left hand': ['Ring of Tesla', 'Ring of King'],
'right hand': ['Ring of Asia', 'Ring of Cold']}
  • 映射

键值对用:空格来表示:

yaml.load("""
base armor: 0
base damaage: [4,4]
plus to: 16
multi:
- test test
- tets
""")
{'base armor': 0,
'base damaage': [4, 4],
'plus to': 16,
'multi': ['test test', 'tets']}

复杂的键可以用?空格,比如字典的键如果是tuple类型,而序列是List,众所周知,Python中字典的键只能是不可变的对象,所以需要将List 转换为tuple.

yaml.load("""
? !!python/tuple [0,0]
: The hero
""")
{(0, 0): 'The hero'}

映射也可以嵌套:

yaml.load("""
hero:
hp: 34
sp: 9
orc:
hp: 12
sp: 34
""")
{'hero': {'hp': 34, 'sp': 9}, 'orc': {'hp': 12, 'sp': 34}}

映射也可以嵌套在序列中

yaml.load("""
- name: PyYAML
status: 4
langauage: python
- name: PYSYCK
status: 5
license: BSD
""")
[{'name': 'PyYAML', 'status': 4, 'langauage': 'python'},
{'name': 'PYSYCK', 'status': 5, 'license': 'BSD'}]
  • 标量

有5种标量:纯文本,单引号,双一号,字面量,折叠式

yaml.load("""
plain: Scroll of Remove Curse
single-quoted: 'Easy know'
double-quoted: "?"
literal:
__ /.-.\
/ )_____________\\ Y
/_ /=== == === === =\ _\_
( /)=== == === === == Y \
`-------------------( o )
\___/
folded: >
It removed all ordinary curses from all equipped items. # 注意开头的空格
Heavy or permanent curses are unaffected """)
{'plain': 'Scroll of Remove Curse',
'single-quoted': 'Easy know',
'double-quoted': '?',
'literal': '__ /.-. / )_____________\\ Y /_ /=== == === === =\\ _\\_ ( /)=== == === === == Y `-------------------( o ) \\___/',
'folded': 'It removed all ordinary curses from all equipped items. # 注意开头的空格 Heavy or permanent curses are unaffected \n'}

加载YAML

import yaml

直接用yaml.load来加载一个不可信任的文件是非常不安全的,yaml.loadpickle.load一样强大,都可以调用任何Python函数。可以考虑用yaml.safe_load

yaml.load将一个YAML文档转化为一个Python对象。

需要注意的是 '-' 与字符串之间需要有空格,才表示一个列表。

a=yaml.load("""
- Hesper
- Pali
- Apat
- Epip
""")
a
['Hesper', 'Pali', 'Apat', 'Epip']
type(a)
list
yaml.load("""
测试: 中文
age: 30
""")
{'测试': '中文', 'age': 30}

需要重要的是 :与字符串之间也有空格

  • 如果一个字符串或者文件包含多个文档,可以用yaml.load_all函数。
documents="""
---
name: first one
description: dkfsjk
---
name: johnyang
age: 29 ---
- C
- C++
- C#
- B #
"""

注意多个文档之间用---分割。

yaml.load_all(documents)
<generator object load_all at 0x0000029B36EC2390>
for data in yaml.load_all(documents):
print(data)
{'name': 'first one', 'description': 'dkfsjk'}
{'name': 'johnyang', 'age': 29}
['C', 'C++', 'C#', 'B']

空格 '#'是表示注释

  • PyYAML允许构建任意类型的Python对象
yaml.load("""
none: [~,null]
bool: [ture,false,on,off]
int: 42
float: 3.14159
list: [LIST,RES]
dict: {hhp: 13,sps: dkf}
multiDict:
dksk: fjsdk
jfksd: eiw
""")
{'none': [None, None],
'bool': ['ture', False, True, False],
'int': 42,
'float': 3.14159,
'list': ['LIST', 'RES'],
'dict': {'hhp': 13, 'sps': 'dkf'},
'multiDict': {'dksk': 'fjsdk', 'jfksd': 'eiw'}}
  • 甚至Python 类实例可以用!!python/object来创建
class Hero:
def __init__(self,name,hp,sp):
self.name=name
self.hp=hp
self.sp=sp
def __repr__(self):
return "%s(name=%r,hp=%r,sp=%r)" %(self.__class__.__name__,self.name,self.hp,self.sp)
yaml.load("""
!!python/object:__main__.Hero
name: jksdfk
hp: 1200
sp: 0 """)
Hero(name='jksdfk',hp=1200,sp=0)

注意 !!python/object:__main__.Hero中的:后面没有空格!

导出YAML

yaml.dump接受Python对象,导出为一个YAML文档。

print(yaml.dump({'name':'johnyang','age':29,'hobby':['coding','reading','thinking']}))
age: 29
hobby: [coding, reading, thinking]
name: johnyang

yaml.dump接受第二个可选的参数,必须是打开的文本/二进制文件,这种情况下,yaml.dump将会把产生的yaml文档写入该文本,否则yaml.dump返回产生的文档。

stream=open('testYaml.yaml','w')
yaml.dump(data,stream)
print(yaml.dump(data))
{age: 29, name: johnyang}

print(yaml.dump([1,2,3],explicit_start=True))
--- [1, 2, 3]

print(yaml.dump(Hero('Gauss',hp=-3,sp=3)))
!!python/object:__main__.Hero {hp: -3, name: Gauss, sp: 3}

  • yaml.dump支持管控输出格式的可选参数
print(yaml.dump(list(range(50))))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
43, 44, 45, 46, 47, 48, 49]

print(yaml.dump(list(range(50)),width=50,indent=4))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

print(yaml.dump(list(range(5)),canonical=True)) #canonical 意思是典型的;规范化
---
!!seq [
!!int "0",
!!int "1",
!!int "2",
!!int "3",
!!int "4",
]

print(yaml.dump(list(range(5)),default_flow_style=False))
- 0
- 1
- 2
- 3
- 4

print(yaml.dump(list(range(5)),default_flow_style=True))
[0, 1, 2, 3, 4]

print(yaml.dump(list(range(5)),default_flow_style=True,default_style='""'))
[!!int "0", !!int "1", !!int "2", !!int "3", !!int "4"]


PyYaml简单学习的更多相关文章

  1. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  3. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  4. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  5. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  6. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  7. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  8. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  9. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

  10. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

随机推荐

  1. Typecho实现版权声明的三种方式

    在安装完Typecho之后,第一件事应该就是想着如何去折腾了.对于个人博客而言,不希望自己辛辛苦苦写的文章,被别人转载或无脑采集,还不留原地址,所以就需要在文章的末尾地方放上一个版权声明,来提醒下转载 ...

  2. Python - qrcode(二维码模块)

    import qrcode codeText = 'https://www.cnblogs.com/houhuilinblogs' img = qrcode.make(codeText) print( ...

  3. 机器学习 | 强化学习(5) | 价值函数拟合(Value Function Approximation)

    价值函数拟合(Value Function Approximation) 导论(Introduction) 目前的价值函数都是基于打表法(lookup table)进行穷举 对于所有状态\(s\)都有 ...

  4. apache和nginx關聯php的過程

    Nginx端 Nginx是一個服務器,同時也是一個功能強大的proxy服務器,除了進行http請求的代理,還可以進行其他協議請求代理(fastCgi協議),為了能使nginx理解fastCgi協議,n ...

  5. xpath 定位表格里面内容

    向上找页面唯一元素,依次为: 表格体/第一行/第14列 实现代码 Xpath==//tbody/tr[1]/td[11]

  6. Windows 提权-内核利用_1

    本文通过 Google 翻译 Kernel Exploits Part 1 – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...

  7. Delphi 判断操作系统是32位或是64位

    function IsWin64: Boolean; var Kernel32Handle: THandle; IsWow64Process: function(Handle: Windows.THa ...

  8. Electron 客户端开机自启动

    app.setLoginItemSettings 与 auto-launch 对比分析 一.稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有 ...

  9. FastAPI 核心功能的完整示例代码,涵盖 WebSocket、后台任务、生命周期事件、中间件配置及会话管理

    以下是一个整合 FastAPI 核心功能的完整示例代码,涵盖 WebSocket.后台任务.生命周期事件.中间件配置及会话管理.代码结构参考了多个技术文档的最佳实践: from contextlib ...

  10. Java 21 新特性

    Java 21 是 Java 语言的一次重要更新,引入了若干新的特性,提升了开发者的编程效率和代码质量.本文将详细介绍 Java 21 的新特性,包括基础概念.使用方法.常见实践以及最佳实践. 简介 ...