<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Python中yaml檔案的讀寫(使用PyYAML庫)。最近在搭建自動化測試專案過程中經常遇到yaml檔案的讀寫,為了方便後續使用,決定記下筆記。
最近在搭建自動化測試專案過程中經常遇到yaml檔案的讀寫,為了方便後續使用,決定記下筆記。
YAML,Yet Another Markup Language的簡寫,通常用來編寫專案設定,也可用於資料儲存,相比conf等組態檔要更簡潔。
字典、列表、字串、布林值、整數、浮點數、Null、時間等
1、大小寫敏感
2、使用縮排表示層級關係
3、相同層級的元素左側對齊
4、鍵值對用冒號 “:” 結構表示,冒號與值之間需用空格分隔
5、陣列前加有 “-” 符號,符號與值之間需用空格分隔
6、None值可用null 和 ~ 表示
7、多組資料之間使用3橫槓---分割
8、# 表示註釋,但不能在一段程式碼的行末尾加 #註釋,否則會報錯
注意:網上查詢到各種部落格都提到yaml縮排時不能使用tab鍵,但我在pycharm編輯器裡實際使用時是可以使用tab鍵進行縮排的,讀寫時並沒有報錯!
python沒有自帶的處理yaml檔案的庫,需要下載第三方庫PyYAML 或 ruamel.yaml ,這裡我們安裝PyYAML。
pip install pyyaml # 下載速度慢的話加上清華映象源 pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple
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']))
讀取結果:
{'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'>
從讀取結果可以看出:
1,讀取出來的資料不會改變原資料型別,即yaml裡是什麼資料型別,讀出來就是什麼型別。
2,Loader=yaml.FullLoader
引數不寫的話對結果不會有影響,但執行時會出現警告資訊。
3,yaml.load(f.read(), Loader=yaml.FullLoader)
也可以寫成yaml.load(f, Loader=yaml.FullLoader)
,讀取出來的結果相同。
yaml中list格式:資料前加'-' 並使用空格與資料間隔開,如下:
# 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))
讀取結果:
['Android', 10, None, None, True] <class 'list'>
yaml中儲存元組格式:yaml中使用!!對資料型別進行轉換,yaml中tuple由list轉換而來。如下:
# 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))
讀取結果:
('Android', 10, None, None, True) <class 'tuple'>
在實際使用中,很多的時候往往是多種型別巢狀的資料。如下yaml資料
# yaml檔名yamlData os: Android osVersion: 10 account: - username1: xiaoqq - password1: 123456 - username2: Lilei - password2: 888888 deviceName: null appPackage: ~ bool1: True
讀取結果:
{'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}
yaml多組資料時,每組資料之間需要用3橫槓分隔'---',如下:
os: Android osVersion: 10 account1: username1: xiaoqq password1: 123456 --- os: ios osVersion: 12 account1: username2: Lilei password2: 888888
從yaml中讀取多組資料時需要使用yaml.load_all()
方法,返回結果為一個生成器,需要使用for迴圈語句獲取每組資料。程式碼如下:
# @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)
讀取結果:
<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.dump()方法,加入allow_unicode=True
引數防止寫入的中文亂碼,如下:
# @author: 給你一頁白紙 import yaml apiData = { "page": 1, "msg": "地址", "data": [{ "id": 1, "name": "學校" }, { "id": 2, "name": "公寓" "id": 3, "name": "流動人口社群" }], } with open('./writeYamlData.yml', 'w', encoding='utf-8') as f: yaml.dump(data=apiData, stream=f, allow_unicode=True)
寫入結果:
data:
- id: 1
name: 學校
- id: 2
name: 公寓
- id: 3
name: 流動人口社群
msg: 地址
page: 1
使用yaml.dump_all()方法,如下:
# @author: 給你一頁白紙
import yaml
apiData1 = {
"page": 1,
"msg": "地址",
"data": [{
"id": 1,
"name": "學校"
}, {
"id": 2,
"name": "公寓"
"id": 3,
"name": "流動人口社群"
}],
}
apiData2 = {
"page": 2,
"name": "酒店"
"name": "醫院"
"name": "養老院"
with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)
寫入結果:
data:
- id: 1
name: 學校
- id: 2
name: 公寓
- id: 3
name: 流動人口社群
msg: 地址
page: 1
---
data:
- id: 1
name: 酒店
- id: 2
name: 醫院
- id: 3
name: 養老院
msg: 地址
page: 2
在Python中除了PyYAML庫之外,還有ruamel.yaml庫也可以對yaml檔案進行讀寫操作,後續再記筆記進行介紹。
到此這篇關於Python使用PyYAML庫讀寫yaml檔案的方法的文章就介紹到這了,更多相關Python讀寫yaml檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45