Python使用PyYAML庫讀寫yaml文件的方法
Python中yaml文件的讀寫(使用PyYAML庫)。最近在搭建自動(dòng)化測(cè)試項(xiàng)目過程中經(jīng)常遇到y(tǒng)aml文件的讀寫,為了方便后續(xù)使用,決定記下筆記。
最近在搭建自動(dòng)化測(cè)試項(xiàng)目過程中經(jīng)常遇到y(tǒng)aml文件的讀寫,為了方便后續(xù)使用,決定記下筆記。
一,YAML 簡介
YAML,Yet Another Markup Language的簡寫,通常用來編寫項(xiàng)目配置,也可用于數(shù)據(jù)存儲(chǔ),相比conf等配置文件要更簡潔。
二,YAML 語法
- 支持的數(shù)據(jù)類型:
字典、列表、字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)、Null、時(shí)間等
- 基本語法規(guī)則:
1、大小寫敏感
2、使用縮進(jìn)表示層級(jí)關(guān)系
3、相同層級(jí)的元素左側(cè)對(duì)齊
4、鍵值對(duì)用冒號(hào) “:” 結(jié)構(gòu)表示,冒號(hào)與值之間需用空格分隔
5、數(shù)組前加有 “-” 符號(hào),符號(hào)與值之間需用空格分隔
6、None值可用null 和 ~ 表示
7、多組數(shù)據(jù)之間使用3橫杠---分割
8、# 表示注釋,但不能在一段代碼的行末尾加 #注釋,否則會(huì)報(bào)錯(cuò)
注意:網(wǎng)上查找到各種博客都提到y(tǒng)aml縮進(jìn)時(shí)不能使用tab鍵,但我在pycharm編輯器里實(shí)際使用時(shí)是可以使用tab鍵進(jìn)行縮進(jìn)的,讀寫時(shí)并沒有報(bào)錯(cuò)!
三,安裝第三方y(tǒng)aml文件處理庫PyYAML
python沒有自帶的處理yaml文件的庫,需要下載第三方庫PyYAML 或 ruamel.yaml ,這里我們安裝PyYAML。
pip install pyyaml # 下載速度慢的話加上清華鏡像源 pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple
四,讀取yaml文件
1,從yaml中讀取字典
yaml中的字典格式如下:
# yaml文件,文件名為yamlData os: Android osVersion: 10 account: username: xiaoqq password: 123456 deviceName: null appPackage: ~ bool1: True
讀取字典代碼:
# @author: 給你一頁白紙 import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result)) print(result['os'], type(result['os'])) print(result['osVersion'], type(result['osVersion'])) print(result['account'], type(result['account'])) print(result['account']['username']) print(result['deviceName']) print(result['appPackage']) print(result['bool1'], type(result['bool1']))
讀取結(jié)果:
{'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None} <class 'dict'>
Android <class 'str'>
10 <class 'int'>
{'username': 'xiaoqq', 'password': 123456} <class 'dict'>
xiaoqq
None
None
True <class 'bool'>
從讀取結(jié)果可以看出:
1,讀取出來的數(shù)據(jù)不會(huì)改變?cè)瓟?shù)據(jù)類型,即yaml里是什么數(shù)據(jù)類型,讀出來就是什么類型。
2,Loader=yaml.FullLoader
參數(shù)不寫的話對(duì)結(jié)果不會(huì)有影響,但運(yùn)行時(shí)會(huì)出現(xiàn)警告信息。
3,yaml.load(f.read(), Loader=yaml.FullLoader)
也可以寫成yaml.load(f, Loader=yaml.FullLoader)
,讀取出來的結(jié)果相同。
2,從yaml中讀取list
yaml中l(wèi)ist格式:數(shù)據(jù)前加'-' 并使用空格與數(shù)據(jù)間隔開,如下:
# yaml文件名yamlData - Android - 10 - null - ~ - True
讀取list代碼:
# @author: 給你一頁白紙 import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result))
讀取結(jié)果:
['Android', 10, None, None, True] <class 'list'>
3,從yaml中讀取元組
yaml中存儲(chǔ)元組格式:yaml中使用!!對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,yaml中tuple由list轉(zhuǎn)換而來。如下:
# yaml文件名yamlData !!python/tuple - Android - 10 - null - ~ - True
讀取元組代碼:
# @author: 給你一頁白紙 import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result))
讀取結(jié)果:
('Android', 10, None, None, True) <class 'tuple'>
在實(shí)際使用中,很多的時(shí)候往往是多種類型嵌套的數(shù)據(jù)。如下yaml數(shù)據(jù)
# yaml文件名yamlData os: Android osVersion: 10 account: - username1: xiaoqq - password1: 123456 - username2: Lilei - password2: 888888 deviceName: null appPackage: ~ bool1: True
讀取結(jié)果:
{'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}
4,從yaml中讀取多組數(shù)據(jù)
yaml多組數(shù)據(jù)時(shí),每組數(shù)據(jù)之間需要用3橫杠分隔'---',如下:
os: Android osVersion: 10 account1: username1: xiaoqq password1: 123456 --- os: ios osVersion: 12 account1: username2: Lilei password2: 888888
從yaml中讀取多組數(shù)據(jù)時(shí)需要使用yaml.load_all()
方法,返回結(jié)果為一個(gè)生成器,需要使用for循環(huán)語句獲取每組數(shù)據(jù)。代碼如下:
# @author: 給你一頁白紙 import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load_all(f.read(), Loader=yaml.FullLoader) print(result, type(result)) for i in result: print(i)
讀取結(jié)果:
<generator object load_all at 0x000001F78EBD5B48> <class 'generator'>
{'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}}
{'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}}
五,寫入yaml文件
1,單組數(shù)據(jù)寫入yaml文件
使用yaml.dump()方法,加入allow_unicode=True
參數(shù)防止寫入的中文亂碼,如下:
# @author: 給你一頁白紙 import yaml apiData = { "page": 1, "msg": "地址", "data": [{ "id": 1, "name": "學(xué)校" }, { "id": 2, "name": "公寓" "id": 3, "name": "流動(dòng)人口社區(qū)" }], } with open('./writeYamlData.yml', 'w', encoding='utf-8') as f: yaml.dump(data=apiData, stream=f, allow_unicode=True)
寫入結(jié)果:
data:
- id: 1
name: 學(xué)校
- id: 2
name: 公寓
- id: 3
name: 流動(dòng)人口社區(qū)
msg: 地址
page: 1
2,多組數(shù)據(jù)寫入yaml文件
使用yaml.dump_all()方法,如下:
# @author: 給你一頁白紙
import yaml
apiData1 = {
"page": 1,
"msg": "地址",
"data": [{
"id": 1,
"name": "學(xué)校"
}, {
"id": 2,
"name": "公寓"
"id": 3,
"name": "流動(dòng)人口社區(qū)"
}],
}
apiData2 = {
"page": 2,
"name": "酒店"
"name": "醫(yī)院"
"name": "養(yǎng)老院"
with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)
寫入結(jié)果:
data:
- id: 1
name: 學(xué)校
- id: 2
name: 公寓
- id: 3
name: 流動(dòng)人口社區(qū)
msg: 地址
page: 1
---
data:
- id: 1
name: 酒店
- id: 2
name: 醫(yī)院
- id: 3
name: 養(yǎng)老院
msg: 地址
page: 2
在Python中除了PyYAML庫之外,還有ruamel.yaml庫也可以對(duì)yaml文件進(jìn)行讀寫操作,后續(xù)再記筆記進(jìn)行介紹。
到此這篇關(guān)于Python使用PyYAML庫讀寫yaml文件的方法的文章就介紹到這了,更多相關(guān)Python讀寫yaml文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Djongo模塊在Django中使用MongoDB數(shù)據(jù)庫
Django框架為我們提供了簡潔方便的ORM模型供我們對(duì)數(shù)據(jù)庫進(jìn)行各種操作,但是這個(gè)“數(shù)據(jù)庫”卻并不包括NoSQL的典型——MongoDB。不少Django初學(xué)者也會(huì)到處詢問,如何才能在Django中使用MongoDB。本文將介紹使用Djongo來在Django中集成MongoDB數(shù)據(jù)庫2021-06-06使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注
論文繪圖時(shí)經(jīng)常需要多圖嵌套,正好最近繪圖用到了,所以這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)嵌套繪圖并為條形圖添加自定義標(biāo)注,感興趣的可以了解下2024-02-02常用python數(shù)據(jù)類型轉(zhuǎn)換函數(shù)總結(jié)
這篇文章主要介紹了常用的python數(shù)據(jù)類型轉(zhuǎn)換函數(shù),并用實(shí)際例子說明了這些函數(shù)的用法,需要的朋友可以參考下2014-03-03pytorch 實(shí)現(xiàn)計(jì)算 kl散度 F.kl_div()
這篇文章主要介紹了pytorch 實(shí)現(xiàn)計(jì)算 kl散度 F.kl_div(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python實(shí)現(xiàn)為PDF去除水印的示例代碼
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)PDF去除水印功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04