詳解Python中Pyyaml模塊的使用
一、YAML是什么
YAML是專門用來(lái)寫(xiě)配置文件的語(yǔ)言,遠(yuǎn)比JSON格式方便。
YAML語(yǔ)言的設(shè)計(jì)目標(biāo),就是方便人類讀寫(xiě)。
YAML是一種比XML和JSON更輕的文件格式,也更簡(jiǎn)單更強(qiáng)大,它可以通過(guò)縮進(jìn)來(lái)表示結(jié)構(gòu),是不是聽(tīng)起來(lái)就和Python很搭?
顧名思義,用語(yǔ)言編寫(xiě)的文件就可以稱之為YAML文件。PyYaml是Python的一個(gè)專門針對(duì)YAML文件操作的模塊,使用起來(lái)非常簡(jiǎn)單
安裝 pip install pyyaml # 如果是py2,使用 pip install yaml
二、PyYaml的簡(jiǎn)單使用
使用起來(lái)非常簡(jiǎn)單,就像json、pickle一樣,load、dump就足夠我們使用了。
load()示例:返回一個(gè)對(duì)象
import yamlyaml_str = '''name: 一條大河age: 1956job: Singer'''y = yaml.load(yaml_str, Loader=yaml.SafeLoader)print(y)
運(yùn)行結(jié)果:
{’name’: ’一條大河’, ’age’: 1956, ’job’: ’Singer’}
load_all()示例:生成一個(gè)迭代器
如果string或文件包含幾塊yaml文檔,可以使用yaml.load_all來(lái)解析全部的文檔。
yaml_test.yaml文件內(nèi)容:
---name: qiyuage: 20歲---name: qingqingage: 19歲
操作yaml文件的test.py文件如下:
import yamlwith open('./yaml_test', ’r’, encoding=’utf-8’) as ymlfile: cfg = yaml.load_all(ymlfile, Loader=yaml.SafeLoader) for data in cfg: print(data)
運(yùn)行結(jié)果:
{’name’: ’qiyu’, ’age’: ’20歲’}{’name’: ’qingqing’, ’age’: ’19歲’}
dump()示例:將一個(gè)python對(duì)象生成為yaml文檔
import yamljson_data = {’name’: ’一條大河’, ’age’: 1956, ’job’: [’Singer’,’Dancer’]}y = yaml.dump(json_data, default_flow_style=False).encode(’utf-8’).decode(’unicode_escape’)print(y)
運(yùn)行結(jié)果:
age: 1956job:- Singer- Dancername: '一條大河'
使用dump()傳入?yún)?shù),可以直接把內(nèi)容寫(xiě)入到y(tǒng)aml文件:
import yamljson_data = {’name’: ’一條大河’, ’age’: 1956, ’job’: [’Singer’, ’Dancer’]}with open(’./yaml_write.yaml’, ’w’) as f: y = yaml.dump(json_data, f) print(y)
寫(xiě)入內(nèi)容后的yaml_write.yaml:
yaml.dump_all()示例:將多個(gè)段輸出到一個(gè)文件中
import yamlobj1 = {'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)
寫(xiě)入內(nèi)容后的yaml_write_all.yaml:
為什么寫(xiě)入文件后的格式有的帶1個(gè)“-”,有的帶2個(gè)“-”?
為什么yaml文件讀出來(lái)的的格式是List?
三、YAML的語(yǔ)法規(guī)則和數(shù)據(jù)結(jié)構(gòu)
看完了以上4個(gè)簡(jiǎn)單的示例,現(xiàn)在就來(lái)總結(jié)下YAML語(yǔ)言的基本語(yǔ)法
YAML 基本語(yǔ)法規(guī)則如下:
1、大小寫(xiě)敏感
2、使用縮進(jìn)表示層級(jí)關(guān)系
3、縮進(jìn)時(shí)不允許使用Tab鍵,只允許使用空格。
4、縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)的元素左側(cè)對(duì)齊即可
5、# 表示注釋,從這個(gè)字符一直到行尾,都會(huì)被解析器忽略,這個(gè)和python的注釋一樣
6、列表里的項(xiàng)用'-'來(lái)代表,字典里的鍵值對(duì)用':'分隔
知道了語(yǔ)法規(guī)則,現(xiàn)在來(lái)回答下上面的2個(gè)問(wèn)題:
1、帶1個(gè)“-”表示不同的模塊(單個(gè)數(shù)組或者字典),帶2個(gè)“-”是因?yàn)閿?shù)組中元素以“-”開(kāi)始,加上表示不同模塊的那一個(gè)“-”,呈現(xiàn)出來(lái)就是2個(gè)“-”
2、因?yàn)閥aml文件中包含多個(gè)模塊(多個(gè)數(shù)組或者字典),讀取出來(lái)的是這些模塊的一個(gè)集合
3、有且只有當(dāng)yaml文件中只有1個(gè)字典時(shí),讀取出來(lái)的數(shù)據(jù)的類型也是字典
YAML 支持的數(shù)據(jù)結(jié)構(gòu)有3種:
1、對(duì)象:鍵值對(duì)的集合
2、數(shù)組:一組按次序排列的值,序列(sequence) 或 列表(list)
3、純量(scalars):?jiǎn)蝹€(gè)的、不可再分的值,如:字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)、Null、時(shí)間、日期
支持?jǐn)?shù)據(jù)示例:
yaml_test_data.yaml的內(nèi)容:
str: 'Big River' #字符串int: 1548 #整數(shù)float: 3.14#浮點(diǎn)數(shù)boolean: true #布爾值None: null# 也可以用 ~ 號(hào)來(lái)表示 nulltime: ’2019-11-20T08:47:46.576701+00:00’ # 時(shí)間,ISO8601 date: 2019-11-20 16:47:46.576702# 日期
操作代碼:
import yamlimport datetimeimport pytzyaml_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)
控制臺(tái)輸出:
其他語(yǔ)法規(guī)則
1、如果字符串沒(méi)有空格或特殊字符,不需要加引號(hào),但如果其中有空格或特殊字符,就需要加引號(hào)了
2、引用
& 和 * 用于引用
name: &name SKPtester: *name
運(yùn)行結(jié)果:
{’name’: ’SKP’, ’tester’: ’SKP’}
3、強(qiáng)制轉(zhuǎn)換
用 !! 實(shí)現(xiàn)
str: !!str 3.14int: !!int '123'
運(yùn)行結(jié)果:
{’int’: 123, ’str’: ’3.14’}
4、分段
在同一個(gè)yaml文件中,可以用“—”3個(gè)“-”來(lái)分段,這樣可以將多個(gè)文檔寫(xiě)在一個(gè)文件中
舉例見(jiàn)上述load_all()示例
四、python對(duì)象生成yaml文檔
1、yaml.dump()方法
import yamlimport osdef 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: zhustudents:- a- b'''
2、使用ruamel模塊中的yaml方法生成標(biāo)準(zhǔn)的yaml文檔
import osfrom ruamel import yaml # pip3 install ruamel.yamldef 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: zhustudents:- a- b'''
使用ruamel模塊中的yaml方法讀取yaml文檔(用法與單獨(dú)import yaml模塊一致)
import osfrom ruamel import yamldef 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)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera2. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)3. React優(yōu)雅的封裝SvgIcon組件示例4. jsp文件下載功能實(shí)現(xiàn)代碼5. ASP中格式化時(shí)間短日期補(bǔ)0變兩位長(zhǎng)日期的方法6. jsp+servlet實(shí)現(xiàn)猜數(shù)字游戲7. ASP基礎(chǔ)知識(shí)Command對(duì)象講解8. XML入門精解之結(jié)構(gòu)與語(yǔ)法9. ASP腳本組件實(shí)現(xiàn)服務(wù)器重啟10. jsp+mysql實(shí)現(xiàn)網(wǎng)頁(yè)的分頁(yè)查詢
