Python中Pyyaml模塊的使用

1、YAML是什麼python

YAML是專門用來寫配置文件的語言,遠比JSON格式方便。json

YAML語言的設計目標,就是方便人類讀寫。數組

YAML是一種比XML和JSON更輕的文件格式,也更簡單更強大,它能夠經過縮進來表示結構,是否是聽起來就和Python很搭?數據結構

顧名思義,用語言編寫的文件就能夠稱之爲YAML文件。PyYaml是Python的一個專門針對YAML文件操做的模塊,使用起來很是簡單spa

安裝 pip install pyyaml   # 若是是py2,使用 pip install yaml

2、PyYaml的簡單使用scala

使用起來很是簡單,就像json、pickle同樣,load、dump就足夠咱們使用了。設計

load()示例:返回一個對象code

import yaml yaml_str = """ name: 一條大河 age: 1956 job: Singer """ y = yaml.load(yaml_str, Loader=yaml.SafeLoader) print(y)

運行結果:orm

{'name': '一條大河', 'age': 1956, 'job': 'Singer'}

load_all()示例:生成一個迭代器對象

若是string或文件包含幾塊yaml文檔,可使用yaml.load_all來解析所有的文檔。

yaml_test.yaml文件內容:

---
name: qiyu
age: 20歲
---
name: qingqing
age: 19歲

操做yaml文件的test.py文件以下:

import yaml with open("./yaml_test", 'r', encoding='utf-8') as ymlfile: cfg = yaml.load_all(ymlfile, Loader=yaml.SafeLoader) for data in cfg: print(data)

運行結果:

{'name': 'qiyu', 'age': '20歲'} {'name': 'qingqing', 'age': '19歲'}

dump()示例:將一個python對象生成爲yaml文檔

import yaml json_data = {'name': '一條大河', 'age': 1956, 'job': ['Singer','Dancer']} y = yaml.dump(json_data, default_flow_style=False).encode('utf-8').decode('unicode_escape') print(y)

運行結果:

age: 1956
job:
- Singer
- Dancer
name: "一條大河"

使用dump()傳入參數,能夠直接把內容寫入到yaml文件:

import yaml json_data = {'name': '一條大河', 'age': 1956, 'job': ['Singer', 'Dancer']} with open('./yaml_write.yaml', 'w') as f: y = yaml.dump(json_data, f) print(y)

寫入內容後的yaml_write.yaml:

yaml.dump_all()示例:將多個段輸出到一個文件中

import yaml

obj1 = {"name": "river", "age": 2019}
obj2 = ["Lily", 1956]
obj3 = {"gang": "ben", "age": 1963}
obj4 = ["Zhuqiyu", 1994]

with open('./yaml_write_all.yaml', 'w', encoding='utf-8') as f:
y = yaml.dump([obj1, obj2, obj3, obj4], f)
print(y)

with open('./yaml_write_all.yaml', 'r') as r:
y1 = yaml.load(r, Loader=yaml.SafeLoader)
print(y1)

寫入內容後的yaml_write_all.yaml:

爲何寫入文件後的格式有的帶1個「-」,有的帶2個「-」?

爲何yaml文件讀出來的的格式是List?

3、YAML的語法規則和數據結構

看完了以上4個簡單的示例,如今就來總結下YAML語言的基本語法

YAML 基本語法規則以下:

1、大小寫敏感
2、使用縮進表示層級關係
3、縮進時不容許使用Tab鍵,只容許使用空格。
4、縮進的空格數目不重要,只要相同層級的元素左側對齊便可
五、# 表示註釋,從這個字符一直到行尾,都會被解析器忽略,這個和python的註釋同樣

六、列表裏的項用"-"來表明,字典裏的鍵值對用":"分隔

知道了語法規則,如今來回答下上面的2個問題:

一、帶1個「-」表示不一樣的模塊(單個數組或者字典),帶2個「-」是由於數組中元素以「-」開始,加上表示不一樣模塊的那一個「-」,呈現出來就是2個「-」

二、由於yaml文件中包含多個模塊(多個數組或者字典),讀取出來的是這些模塊的一個集合

三、有且只有當yaml文件中只有1個字典時,讀取出來的數據的類型也是字典

YAML 支持的數據結構有3種:

一、對象:鍵值對的集合二、數組:一組按次序排列的值,序列(sequence) 或 列表(list) 三、純量(scalars):單個的、不可再分的值,如:字符串、布爾值、整數、浮點數、Null、時間、日期

支持數據示例:

yaml_test_data.yaml的內容:

str: "Big River"                           #字符串
int: 1548                                 #整數
float: 3.14                               #浮點數
boolean: true                              #布爾值
None: null                                # 也能夠用 ~ 號來表示 null
time: '2019-11-20T08:47:46.576701+00:00'       # 時間,ISO8601 
date: 2019-11-20 16:47:46.576702 # 日期

操做代碼:

import yaml import datetime import pytz yaml_data = { "str": "Big River", "int": 1548, "float": 3.14, 'boolean': True, "None": None, 'time': datetime.datetime.now(tz=pytz.timezone('UTC')).isoformat(), 'date': datetime.datetime.today() } with open('./yaml_test', 'w') as f: y = yaml.dump(yaml_data, f) print(y) with open('./yaml_test', 'r') as r: y1 = yaml.load(r, Loader=yaml.SafeLoader) print(y1)

控制檯輸出:

其餘語法規則

一、若是字符串沒有空格或特殊字符,不須要加引號,但若是其中有空格或特殊字符,就須要加引號了

二、引用

& 和 * 用於引用

name: &name SKP tester: *name

運行結果:

{'name': 'SKP', 'tester': 'SKP'}

三、強制轉換

用 !! 實現

str: !!str 3.14 int: !!int "123"

運行結果:

{'int': 123, 'str': '3.14'}

四、分段

在同一個yaml文件中,能夠用「---」3個「-」來分段,這樣能夠將多個文檔寫在一個文件中

舉例見上述load_all()示例

4、python對象生成yaml文檔

一、yaml.dump()方法

import yaml import os def generate_yaml_doc(yaml_file): py_object = {'school': 'zhu', 'students': ['a', 'b']} file = open(yaml_file, 'w', encoding='utf-8') yaml.dump(py_object, file) file.close() current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "generate.yaml") generate_yaml_doc(yaml_path) """結果 school: zhu students: - a - b """

二、使用ruamel模塊中的yaml方法生成標準的yaml文檔

import os
from ruamel import yaml # pip3 install ruamel.yaml def generate_yaml_doc_ruamel(yaml_file): py_object = {'school': 'zhu', 'students': ['a', 'b']} file = open(yaml_file, 'w', encoding='utf-8') yaml.dump(py_object, file, Dumper=yaml.RoundTripDumper) file.close() current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "generate.yaml") generate_yaml_doc_ruamel(yaml_path) """結果 school: zhu students: - a - b """

使用ruamel模塊中的yaml方法讀取yaml文檔(用法與單獨import yaml模塊一致)

import os from ruamel import yaml def get_yaml_data_ruamel(yaml_file): file = open(yaml_file, 'r', encoding='utf-8') data = yaml.load(file, Loader=yaml.Loader) file.close() print(data) current_path = os.path.abspath(".") yaml_path = os.path.join(current_path, "generate.yaml") get_yaml_data_ruamel(yaml_path)
相關文章
相關標籤/搜索