詳解Python中Pyyaml模塊的使用
一、YAML是什么
YAML是專門用來寫配置文件的語言,遠(yuǎn)比JSON格式方便。
YAML語言的設(shè)計目標(biāo),就是方便人類讀寫。
YAML是一種比XML和JSON更輕的文件格式,也更簡單更強(qiáng)大,它可以通過縮進(jìn)來表示結(jié)構(gòu),是不是聽起來就和Python很搭?
顧名思義,用語言編寫的文件就可以稱之為YAML文件。PyYaml是Python的一個專門針對YAML文件操作的模塊,使用起來非常簡單
安裝 pip install pyyaml # 如果是py2,使用 pip install yaml
二、PyYaml的簡單使用
使用起來非常簡單,就像json、pickle一樣,load、dump就足夠我們使用了。
load()示例:返回一個對象
import yaml yaml_str = """ name: 一條大河 age: 1956 job: Singer """ y = yaml.load(yaml_str, Loader=yaml.SafeLoader) print(y)
運行結(jié)果:
{'name': '一條大河', 'age': 1956, 'job': 'Singer'}
load_all()示例:生成一個迭代器
如果string或文件包含幾塊yaml文檔,可以使用yaml.load_all來解析全部的文檔。
yaml_test.yaml文件內(nèi)容:
--- 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)
運行結(jié)果:
{'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)
運行結(jié)果:
age: 1956
job:
- Singer
- Dancer
name: "一條大河"
使用dump()傳入?yún)?shù),可以直接把內(nèi)容寫入到y(tǒng)aml文件:
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)
寫入內(nèi)容后的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)
寫入內(nèi)容后的yaml_write_all.yaml:
為什么寫入文件后的格式有的帶1個“-”,有的帶2個“-”?
為什么yaml文件讀出來的的格式是List?
三、YAML的語法規(guī)則和數(shù)據(jù)結(jié)構(gòu)
看完了以上4個簡單的示例,現(xiàn)在就來總結(jié)下YAML語言的基本語法
YAML 基本語法規(guī)則如下:
1、大小寫敏感
2、使用縮進(jìn)表示層級關(guān)系
3、縮進(jìn)時不允許使用Tab鍵,只允許使用空格。
4、縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可
5、# 表示注釋,從這個字符一直到行尾,都會被解析器忽略,這個和python的注釋一樣
6、列表里的項用"-"來代表,字典里的鍵值對用":"分隔
知道了語法規(guī)則,現(xiàn)在來回答下上面的2個問題:
1、帶1個“-”表示不同的模塊(單個數(shù)組或者字典),帶2個“-”是因為數(shù)組中元素以“-”開始,加上表示不同模塊的那一個“-”,呈現(xiàn)出來就是2個“-”
2、因為yaml文件中包含多個模塊(多個數(shù)組或者字典),讀取出來的是這些模塊的一個集合
3、有且只有當(dāng)yaml文件中只有1個字典時,讀取出來的數(shù)據(jù)的類型也是字典
YAML 支持的數(shù)據(jù)結(jié)構(gòu)有3種:
1、對象:鍵值對的集合
2、數(shù)組:一組按次序排列的值,序列(sequence) 或 列表(list)
3、純量(scalars):單個的、不可再分的值,如:字符串、布爾值、整數(shù)、浮點數(shù)、Null、時間、日期
支持?jǐn)?shù)據(jù)示例:
yaml_test_data.yaml的內(nèi)容:
str: "Big River" #字符串 int: 1548 #整數(shù) float: 3.14 #浮點數(shù) 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)
控制臺輸出:
其他語法規(guī)則
1、如果字符串沒有空格或特殊字符,不需要加引號,但如果其中有空格或特殊字符,就需要加引號了
2、引用
& 和 * 用于引用
name: &name SKP tester: *name
運行結(jié)果:
{'name': 'SKP', 'tester': 'SKP'}
3、強(qiáng)制轉(zhuǎn)換
用 !! 實現(xiàn)
str: !!str 3.14 int: !!int "123"
運行結(jié)果:
{'int': 123, 'str': '3.14'}
4、分段
在同一個yaml文件中,可以用“—”3個“-”來分段,這樣可以將多個文檔寫在一個文件中
舉例見上述load_all()示例
四、python對象生成yaml文檔
1、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) """結(jié)果 school: zhu students: - a - b """
2、使用ruamel模塊中的yaml方法生成標(biāo)準(zhǔn)的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) """結(jié)果 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)
到此這篇關(guān)于Python中Pyyaml模塊的使用的文章就介紹到這了,更多相關(guān)Python中Pyyaml模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3連接SQLServer、Oracle、MySql的方法
這篇文章較詳細(xì)的給大家介紹了Python3連接SQLServer、Oracle、MySql的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2018-06-06Python使用MD5加密算法對字符串進(jìn)行加密操作示例
這篇文章主要介紹了Python使用MD5加密算法對字符串進(jìn)行加密操作,結(jié)合實例形式分析了Python實現(xiàn)md5加密相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python 使用PIL numpy 實現(xiàn)拼接圖片的示例
今天小編就為大家分享一篇Python 使用PIL numpy 實現(xiàn)拼接圖片的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Broadcast廣播機(jī)制在Pytorch Tensor Numpy中的使用詳解
python中Broadcast機(jī)制非常實用,在python中的廣播機(jī)制其實很簡單,下方主要介紹Broadcast廣播機(jī)制在Pytorch Tensor Numpy中的使用,希望對你有所幫助2022-08-08Python selenium模塊實現(xiàn)定位過程解析
這篇文章主要介紹了python selenium模塊實現(xiàn)定位過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07python如何給字典的鍵對應(yīng)的值為字典項的字典賦值
這篇文章主要介紹了python如何給字典的鍵對應(yīng)的值為字典項的字典賦值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07