这两天玩欧冠数据, 看到数据格式是.yml结尾的文件, 就查了下什么是yaml文件,Python怎么操作
-
yaml文件简述
yaml: Yet Another Markup Language, 一种基于Unicode容易阅读的、与脚本交互的用于表达资料序列的编程语言。类似于XML,但语法比XML简单得多
-
适用场景:
A、脚本语言 B、序列化 C、配置文件:yaml比XML好编写,比ini文件功能强,但不同语言数据流不建议用。
-
优缺点:
A、易于阅读
B、可移植性
C、匹配敏捷的本机数据结构
D、单程处理
E、表现力和可扩展性 + 易于实现和引用
-
Python操作
-
读操作:
yaml.load()
创建 yaml文件 "1.yml", 写入如下数据:
name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name1: Jenny Smith age1: 12
In [21]: with open('1.yml', 'r') as f: ...: yaml_obj = yaml.load(f, Loader=yaml.SafeLoader) ...: In [22]: yaml_obj
如果使用yaml.load(f) ,会报warning: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. (就是提示 直接load是不安全的, 具体load参数可以参考 https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation#footnotes)
yaml.load_all() # 生成一个迭代器
-
写操作:
yaml.dump(data_obj, file_obj) # 类似于pickle yaml.dump_all([data1_obj, data2_obj], file_obj) # 多个数据对象,以流形式写入 # 示例, 环境是ipython,就会有"..:" 出现: data_dict = { ...: "name": "leron james", ...: "age": 35, ...: "hobby": ["dancing", "rap", "basketball"] ...: } f = open('1.yml', 'w') yaml.dump(data_dict, f)
-
yaml语法简述
-
基本语法
A、大小写敏感
B、缩进表示层级关系,且: 缩进只使用空格,不适用Tab; 缩进多少空格不重要, 重要的是同层元素左对齐
C、# 后表示注释,到行尾都是注释,且只能单行注释
D、: 冒号表示 k-v关系,形式: key:value
E、破折号“-”后加空格,表示列表:
例如:
- name
- age
- sex
就是Python里的 ["name", "age", "sex"]
F、简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
-
yaml -> Python dict
yaml:
name: lebron james age:36 sex:male Python dict:
{ "name": "lebron james", "age":36, "sex":"male"}
-
yaml list -> Python list
yaml : - name - age - sex # Python list ["name", "age", "sex"]
-
list 和 dict 符合结构
# list 内嵌 dict # yaml - name:lebron sex:male age:36 - name:kobe sex:male age:42 Python : [ {"name":"lebron", "sex": "male", "age":36}, {"name":"kobe", "sex": "male", "age":42}]
# list 嵌套 - ["a", "b","c"] - ["name", "age", "sex"] - ["lebron", "james", " kobe"] # python : [ ["a", "b","c"], ["name", "age", "sex"], ["lebron", "james", " kobe"]]