首頁 > 軟體

Python使用PyYAML庫讀寫yaml檔案的方法

2022-04-06 19:02:14

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} <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),讀取出來的結果相同。

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] <class 'list'>

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) <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}

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)

讀取結果:

<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,單組資料寫入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檔案進行讀寫操作,後續再記筆記進行介紹。

到此這篇關於Python使用PyYAML庫讀寫yaml檔案的方法的文章就介紹到這了,更多相關Python讀寫yaml檔案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com