数据及配置文件之争

数据及文件通常有三种类型:

  1. 配置文件型:如ini,conf,properties文件,适合存储简单变量和配置项,最多支持两层,不适合存储多层嵌套数据
  2. 表格矩阵型:如csv,excel等,适合于存储大量同类数据,不适合存储层级结构的数据
  3. 多层嵌套型:如XML,HTMl,JSON、YAML,TOML等,适合存储单条或少数多层嵌套数据,不适合存储大量数据

YAML兼容JSON格式,简洁,强大,灵活,可以很方便的构造层级数据并快速转为Python中的字典。

YAML简介

YAML(YAML Ain't Markup Language)即一种反标记(XML)语言。强调数据为中心,而非标记。YAML大小写敏感,使用缩进代表层级关系。

YAML中支持对象Object(对应Python中的字典), 数组Array(对应Python中的列表)以及常量(字符串、数字(int/float),true/false/null)。

相比于JSON格式,YAML免除了双引号,逗号,大括号,中括号等,(当然也支持原始的JSON格式),并且支持注释,类型转换,跨行,锚点,引用及插入等等。

基本格式

  • 对象:使用key: value表示,冒号后面有一个空格,也可以是使用{key: value} (flow流格式)或{"key": "value"}表示
  • 数组:使用- value表示,-后面有一个空格,每项一行,也可以使用[value1,value2,value3,...] (flow流格式)或["value1", "value2", "value3", ...]
  • 字符串:abc"abc"
  • 数字:123123.45
  • true/false:true/false,TRUE/FALSE,True/Falseon/off, ON/OFF, On/Off
  • null: null,NULL, Null~

示例文件demo.yaml:

  1. # 注释:示例yaml文件
  2. name: Cactus
  3. age: 18
  4. skills:
  5. -
  6. - Python
  7. - 3
  8. -
  9. - Java
  10. - 5
  11. has_blog: true
  12. gf: ~

相当于以下JSON格式

  1. {
  2. "name": "Cactus",
  3. "age": 18,
  4. "skills": [
  5. [
  6. "Python",
  7. 3
  8. ],
  9. [
  10. "Java",
  11. 5
  12. ]
  13. ],
  14. "has_blog": true,
  15. "gf": null
  16. }

类型转换

使用!!str, !!float等可以将默认类型转为指定类型,如

  1. - !!float 3
  2. - !!str 4
  3. - !!str true

对应JSON格式

  1. [
  2. 3.0,
  3. "4",
  4. "true"
  5. ]

多行文本及拼接

  • | 保留多行文本(保留换行符)
  • > 将多行拼接为一行

示例:

  1. a: |

  2. 喜欢你
  3. b: >

  4. 不喜欢你
  5. 才怪

对应JSON格式

  1. {
  2. "a": "我\n喜欢你\n",
  3. "b": "我 不喜欢你 才怪"
  4. }

锚点,引用及插入

-:后 加上&锚点名为当前字段建立锚点,下面可使用*锚点名引用锚点,或使用<<: *锚点名直接将锚点数据插入到当前的数据中,示例如下:

  1. users:
  2. - &zs
  3. name: 张三
  4. password: !!str 123456
  5. - &ls
  6. name: 李四
  7. password: abcdefg
  8. case1:
  9. login: *zs
  10. case2:
  11. user:
  12. <<: *ls
  13. age: 20

对应JSON格式:

  1. {
  2. "users": [
  3. {
  4. "name": "张三",
  5. "password": "123456"
  6. },
  7. {
  8. "name": "李四",
  9. "password": "abcdefg"
  10. }
  11. ],
  12. "case1": {
  13. "login": {
  14. "name": "张三",
  15. "password": "123456"
  16. }
  17. },
  18. "case2": {
  19. "user": {
  20. "name": "李四",
  21. "password": "abcdefg",
  22. "age": 20
  23. }
  24. }
  25. }

Python操作YAML文件及字符串

需要安装pyyaml, pip install pyyaml

和JSON文件类似,yaml也提供load和dump两种方法。

  • yaml.load()yaml.safe_load(YAML字符串或文件句柄):yaml -> 字典,如yaml中有中文,需要使用 字符串.encode('utf-8')或打开文件时指定encoding='utf-8'
  • yaml.dump(字典):默认为flow流格式,即字典{b': {'c': 3, 'd': 4}},会被转为b: {c: 3, d: 4}形式,可以使用default_flow_style=False关闭流模式

由于yaml.load()支持原生Python对象,不安全,建议使用yaml.safe_load()

示例1:yaml字符串 -> 字典

  1. import yaml
  2. yaml_str = '''
  3. name: Cactus
  4. age: 18
  5. skills:
  6. -
  7. - Python
  8. - 3
  9. -
  10. - Java
  11. - 5
  12. has_blog: true
  13. gf: ~
  14. '''
  15. print(yaml.safe_load(yaml_str))

打印结果:

  1. {'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}

如果有中文,可以使用yaml.load(yaml_str.encoding('utf-8))

示例2:yaml文件 -> 字典

  1. import yaml
  2. with open('demo.yaml', encoding='utf-8') as f: # demo.yaml内容同上例yaml字符串
  3. print(yaml.safe_load(f))

打印结果同上例。

字典 -> yaml字符串或文件

  1. import yaml
  2. dict_var = {'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
  3. print(yaml.dump(dict_var,)) # 转为字符串,使用默认flow流格式
  4. with open('demo5.yaml', 'w', encoding='utf-8') as f:
  5. yaml.dump(dict_var, f, default_flow_style=False) # 写入文件,不是用flow流格式

打印内容:

  1. age: 18
  2. gf: null
  3. has_blog: true
  4. name: Cactus
  5. skills:
  6. - [Python, 3]
  7. - [Java, 5]

1demo5.yaml1文件内容:

  1. age: 18
  2. gf: null
  3. has_blog: true
  4. name: Cactus
  5. skills:
  6. - - Python
  7. - 3
  8. - - Java
  9. - 5

更多操作可参考pyyaml官方文档:https://pyyaml.org/wiki/PyYAMLDocumentation

Python3操作YAML文件的更多相关文章

  1. Python操作yaml文件

    基本的yaml语法 http://ansible-tran.readthedocs.io/en/latest/docs/YAMLSyntax.html YAML 还有一个小的怪癖. 所有的 YAML ...

  2. Python - 通过PyYaml库操作YAML文件

    PyYaml简单介绍 Python的PyYAML模块是Python的YAML解析器和生成器 它有个版本分水岭,就是5.1 读取YAML5.1之前的读取方法 def read_yaml(self, pa ...

  3. python操作YAML文件之pyyaml库

    1. YAML简介 YAML是一种被认为可以超越XML.JSON的配置文件,最早接触是Spring Boot,木有想到python也是支持的,遂研究一下. python解析YAML库叫做pyyaml, ...

  4. 【学习笔记】python3中yaml文件使用

    1.yaml -> 字典:用yaml.load()或yaml.safe_load(YAML字符串或文件句柄),如yaml中有中文,可以使用.encode('utf-8')或打开文件时指定enco ...

  5. python基础-PyYaml操作yaml文件

    yaml语法 格式 它的基本语法规则如下 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 YAML 支持的数据结构有 ...

  6. python 操作yaml文件

    yaml 5.1版后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版后就修改了需要指定Loader,通过默认加载​​器(FullLoader)禁止执行任意函数yaml 5.1之 ...

  7. 使用KubeOperator安装k8s集群后,节点主机yaml文件路径

    [root@k8s-develop-master-1 kubernetes]# cd /etc/kubernetes [root@k8s-develop-master-1 kubernetes]# l ...

  8. 对XML和YAML文件实现I/O操作

    1.文件的打开关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: string filename = "I.xml"; FileStora ...

  9. OPENCV(3) —— 对XML和YAML文件实现I/O 操作

    XML\YAML文件在OpenCV中的数据结构为FileStorage string filename = "I.xml"; FileStorage fs(filename, Fi ...

随机推荐

  1. C++新特性---智能指针

    智能指针:     为什么需要智能指针?         1. malloc出来的空间,没有进行释放,存在内存泄漏的问题.          2. 异常安全问题.如果在malloc和free之间如果存 ...

  2. MarkDown 语法记录

    Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 为啥要用 MarkDown 呢? 优点 1.因为是纯文本,所以只要支持Markdown的地方都能获 ...

  3. WebApi 全局异常与局部异常

    全局异常过滤器 public class ApiExceptionFilter:ExceptionFilterAttribute { private IHostingEnvironment _env; ...

  4. vue引入警告:There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing. Compare these

    在写vue项目的时候 当我使用 : import dataSource from '../overseaProduct/house/dataSource'; 引入dataSource文件的时候:控制台 ...

  5. findstr 命令使用

    findstr 命令使用 find /? 在文件中搜索字符串. FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][p ...

  6. 超详细Nginx的安装和配置教程

    一. 编译安装nginx 下载nginx安装包 wget http://nginx.org/download/nginx-1.8.0.tar.gz 也可以选择其他版本,官网:http://nginx. ...

  7. JS 百度地图 地图线路描绘

    JS 百度地图 地图线路描绘 <script type="text/javascript" src="http://api.map.baidu.com/api?v= ...

  8. web开发原生开发混合开发的区别优势

    最近有人在讨论是原生开发好还是,混合开发好,以下是引用了数据来说: 最近原生应用.Web应用.混合应用的名字让我们听得比较熟悉了,现在我们就通过评析各种应用的优缺点来更进一步看看这三者的区别. 一.原 ...

  9. ndk学习之c++语言基础复习----面向对象编程

    关于面向对象编程对于一个java程序员那是再熟悉不过了,不过对于C++而言相对java还是有很多不同点的,所以全面复习一下. 类 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程 ...

  10. 显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中。

    VS调试程序运行中提示“显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中.错误的原因为: System.IO ...