網站首頁 編程語言 正文
Python中yaml文件的讀寫(使用PyYAML庫)。最近在搭建自動化測試項目過程中經常遇到yaml文件的讀寫,為了方便后續使用,決定記下筆記。
最近在搭建自動化測試項目過程中經常遇到yaml文件的讀寫,為了方便后續使用,決定記下筆記。
一,YAML 簡介
YAML,Yet Another Markup Language的簡寫,通常用來編寫項目配置,也可用于數據存儲,相比conf等配置文件要更簡潔。
二,YAML 語法
- 支持的數據類型:
字典、列表、字符串、布爾值、整數、浮點數、Null、時間等
- 基本語法規則:
1、大小寫敏感
2、使用縮進表示層級關系
3、相同層級的元素左側對齊
4、鍵值對用冒號 “:” 結構表示,冒號與值之間需用空格分隔
5、數組前加有 “-” 符號,符號與值之間需用空格分隔
6、None值可用null 和 ~ 表示
7、多組數據之間使用3橫杠---分割
8、# 表示注釋,但不能在一段代碼的行末尾加 #注釋,否則會報錯
注意:網上查找到各種博客都提到yaml縮進時不能使用tab鍵,但我在pycharm編輯器里實際使用時是可以使用tab鍵進行縮進的,讀寫時并沒有報錯!
三,安裝第三方yaml文件處理庫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']))
讀取結果:
{'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None}
Android
10
{'username': 'xiaoqq', 'password': 123456}
xiaoqq
None
None
True
從讀取結果可以看出:
1,讀取出來的數據不會改變原數據類型,即yaml里是什么數據類型,讀出來就是什么類型。
2,Loader=yaml.FullLoader
參數不寫的話對結果不會有影響,但運行時會出現警告信息。
3,yaml.load(f.read(), Loader=yaml.FullLoader)
也可以寫成yaml.load(f, Loader=yaml.FullLoader)
,讀取出來的結果相同。
2,從yaml中讀取list
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]
3,從yaml中讀取元組
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)
在實際使用中,很多的時候往往是多種類型嵌套的數據。如下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}
4,從yaml中讀取多組數據
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)
讀取結果:
{'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}}
{'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}}
五,寫入yaml文件
1,單組數據寫入yaml文件
使用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
2,多組數據寫入yaml文件
使用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文件進行讀寫操作,后續再記筆記進行介紹。
原文鏈接:https://www.cnblogs.com/lfr0123/p/13652243.html
相關推薦
- 2022-09-27 Python?Matplotlib繪制扇形圖標簽重疊問題解決過程_python
- 2022-05-26 Pytorch中使用ImageFolder讀取數據集時忽略特定文件_python
- 2021-12-17 使用遞歸時返回結果是undefined的原因和解決辦法
- 2022-08-14 使用Python去除字符串中某個字符的多種實現方式比較_python
- 2022-03-29 python實現k-means算法_python
- 2022-07-11 pandas的排序、分組groupby及cumsum累計求和方式_python
- 2022-11-02 Qt5.14.2使用虛擬鍵盤的關鍵代碼_C 語言
- 2023-07-22 linux查看進程的啟動路徑:ll /proc/PID
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支