yaml檔案解析詳解
前言
yaml檔案是什麼?yaml檔案其實也是一種配置檔案型別,相比較ini,conf配置檔案來說,更加的簡潔,操作也更加簡單,同時可以存放不同型別的資料,不會改變原有資料型別,所有的資料型別在讀取時都會原樣輸出,yaml檔案依賴python的第三方庫PyYaml模組
PyYaml安裝
yaml檔案處理需要藉助python的第三方庫,因此我們第一步需要安裝
開啟CMD執行命令: pip install PyYaml 注意:不要把Yaml寫成Ymal
讀yaml檔案
yaml存字典並讀取
config.yaml
cnblog: linux超 address: BeiJing Company: petrochina age: 18 now: 8.14 empty1: null empty2: ~
parseyaml.py
""" ------------------------------------ @Time : 2019/8/14 20:37 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml with open("config.yml", "r", encoding="utf8") as f: context = yaml.load(f, Loader=yaml.FullLoader) print("讀取內容", context, type(context)) print(context["cnblog"], type(context["cnblog"])) print(context["age"], type(context["age"])) print(context["now"], type(context["now"]))print(context["empty1"], type(context["empty1"]))
輸出
讀取內容 {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'> linux超 <class 'str'> 18 <class 'int'> 8.14 <class 'float'> None <class 'NoneType'> Process finished with exit code 0
從輸出結果及yaml檔案內容你可以看到,當前輸出的內容是一個字典型別,yaml檔案中儲存的字串輸出仍是字串型別,int型仍是int型等,儲存None型別可以使用null,~符號以及None,這也是區別ini配置檔案的地方,且檔案內容使用[key:value]的形式定義,當然key和value也可以使用雙引號修飾;上面的yaml檔案只儲存了一組資料,你也可以存放多組資料,看下面的例項
yaml存多組資料並讀取
config.yaml
cnblog: linux超 address: BeiJing Company: petrochina age: 18 now: 8.14 --- name: linux超 gender: 男
parseyaml.py
""" ------------------------------------ @Time : 2019/8/14 20:37 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml with open("config.yml", "r", encoding="utf8") as f: context = yaml.load_all(f, Loader=yaml.FullLoader) print(context) for i in context: print(i)
輸出
我是一個生成器 <generator object load_all at 0x01DDDAB0> {'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14} {'name': 'linux超', 'gender': '男'} Process finished with exit code 0
通過輸出結果及yaml儲存內容可以看出,當yaml檔案儲存多組資料在一個yaml檔案中時,需要使用3個橫杆分割,讀取資料時需要使用load_all方法,而且此方法返回一個生成器,需要使用for迴圈迭代讀取每一組資料下面再看一下yaml如何儲存列表型別資料
yaml儲存列表並讀取
config.yaml
- linux超 - BeiJing - petrochina - 18 - 8.14
parseyaml.py
""" ------------------------------------ @Time : 2019/8/14 20:37 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml with open("config.yml", "r", encoding="utf8") as f: context = yaml.load(f, Loader=yaml.FullLoader) print("讀取內容", context, type(context))
輸出
讀取內容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'> Process finished with exit code 0
當yaml檔案儲存列表資料時,需要使用一個橫槓[- 元素]表示為列表的一個元素,除了列表以外還可以儲存元組,或者說支援強制型別轉換
yaml儲存元組並讀取
config.yml
--- !!python/tuple # 列表轉成元組 - 1 - 2 - 3 --- age: !!str 18 # int 型別轉換為str
parseyaml.py
""" ------------------------------------ @Time : 2019/8/14 19:46 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml with open("./config.yml", "r", encoding="utf-8") as f: context = yaml.load_all(f, Loader=yaml.FullLoader) for i in context: print(i)
輸出
(1, 2, 3) {'age': '18'} Process finished with exit code 0
yaml檔案使用兩個!!號可以對資料進行型別轉換,但是在我看來感覺沒有用,當然可能我沒遇見過需要做型別轉化的情況;你還可以像下面這樣存放更加複雜的資料,比如字典巢狀字典及列表
config.yaml
info: - user: username: linux超 password: linuxxiaochao company: first: petrochina second: lemon teacher
parseyaml.py
""" ------------------------------------ @Time : 2019/8/14 20:37 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml with open("config.yml", "r", encoding="utf8") as f: context = yaml.load(f, Loader=yaml.FullLoader) print("讀取內容\n", context, type(context))
輸出
讀取內容 {'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <class 'dict'> Process finished with exit code 0
小結
實際工作中大概就是儲存字典,列表,或者相互巢狀的資料較常見,那麼在儲存和讀取時需要掌握以下幾點
1.儲存字典時,以[key:value]的形式定義
2.儲存列表時,需要使用[- 元素]表示列表
3.儲存多組資料時,需要每組資料之間使用3個橫槓-分割分割
4.資料巢狀時,需要注意縮排,和編寫python程式碼的縮排規則相同,唯一不同是,yaml中的縮排只要統一即可不需要指定縮排多少
5.讀取一組資料時,直接使用load(stream, loader)方法, 讀取多組資料時需要使用load_all(stream, loader)方法,此方法返回的是一個生成器,需要使用for迴圈讀取每一組資料,還需要注意兩個方法中的最好像我程式碼中一樣傳遞loader引數為FullLoader,否則會報Warnning
寫yaml檔案
向yaml檔案中寫資料就比較簡單了,直接使用dump方法和dump_all方法即可,無論多複雜的資料都可以直接寫入,看例項
dump寫入一組資料
""" ------------------------------------ @Time : 2019/8/14 19:46 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml response = { "status": 1, "code": "1001", "data": [ { "id": 80, "regname": "toml", "pwd": "QW&@JBK!#&#($*@HLNN", "mobilephone": "13691579846", "leavemount": "0.00", "type": "1", "regtime": "2019-08-14 20:24:45.0" }, { "id": 81, "regname": "toml", "pwd": "QW&@JBK!#&#($*@HLNN", "mobilephone": "13691579846", "leavemount": "0.00", "type": "1", "regtime": "2019-08-14 20:24:45.0" } ], "msg": "獲取使用者列表成功" } try: with open("./config.yml", "w", encoding="utf-8") as f: yaml.dump(data=response, stream=f, allow_unicode=True) except Exception as e: print("寫入yaml檔案內容失敗") raise e else: print("寫入yaml檔案內容成功")
生成的yaml檔案內容
code: '1001' data: - id: 80 leavemount: '0.00' mobilephone: '13691579846' pwd: QW&@JBK!#&#($*@HLNN regname: toml regtime: '2019-08-14 20:24:45.0' type: '1' - id: 81 leavemount: '0.00' mobilephone: '13691579846' pwd: QW&@JBK!#&#($*@HLNN regname: toml regtime: '2019-08-14 20:24:45.0' type: '1' msg: 獲取使用者列表成功 status: 1
dump_all寫入多組資料
""" ------------------------------------ @Time : 2019/8/14 19:46 @Auth : linux超 @File : parseYaml.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import yaml response = { "status": 1, "code": "1001", "data": [ { "id": 80, "regname": "toml", "pwd": "QW&@JBK!#&#($*@HLNN", "mobilephone": "13691579846", "leavemount": "0.00", "type": "1", "regtime": "2019-08-14 20:24:45.0" }, { "id": 81, "regname": "toml", "pwd": "QW&@JBK!#&#($*@HLNN", "mobilephone": "13691579846", "leavemount": "0.00", "type": "1", "regtime": "2019-08-14 20:24:45.0" } ], "msg": "獲取使用者列表成功" } info = { "name": "linux超", "age": 18 } try: with open("./config.yml", "w", encoding="utf-8") as f: yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True) except Exception as e: print("寫入yaml檔案內容失敗") raise e else: print("寫入yaml檔案內容成功")
生成的yaml檔案內容
code: '1001' data: - id: 80 leavemount: '0.00' mobilephone: '13691579846' pwd: QW&@JBK!#&#($*@HLNN regname: toml regtime: '2019-08-14 20:24:45.0' type: '1' - id: 81 leavemount: '0.00' mobilephone: '13691579846' pwd: QW&@JBK!#&#($*@HLNN regname: toml regtime: '2019-08-14 20:24:45.0' type: '1' msg: 獲取使用者列表成功 status: 1 --- age: 18 name: linux超
小結
1.寫入一組資料直接使用dump方法或者dump_all方法也可
2.寫入多組資料只能使用dump_all方法
3.寫入資料時最重要的一點需要注意:如果你的資料包含中文,dump和dump_all 方法需要新增allow_unicode=True引數,否則中文寫入後不會正常顯示
總結
1.yaml儲存資料規則-多組資料使用---分割,資料巢狀時注意縮排,儲存字典使用[key: value]的形式,儲存列表使用[- 元素]的形式,使用load讀一組資料,使用load_all 可以讀多組資料
2.yaml檔案寫入一組資料直接使用dump方法,寫入多組資料使用dump_all方法,注意寫入資料帶中文,需要指定引數allow_unicode=