Python基礎(chǔ)筆記1-Python讀寫(xiě)yaml文件(使用PyYAML庫(kù))

最近在搭建自動(dòng)化測(cè)試項(xiàng)目過(guò)程中經(jīng)常遇到y(tǒng)aml文件的讀寫(xiě),為了方便后續(xù)使用,決定記下筆記。

YAML 簡(jiǎn)介

YAML,Yet Another Markup Language的簡(jiǎn)寫(xiě)何暇,通常用來(lái)編寫(xiě)項(xiàng)目配置,也可用于數(shù)據(jù)存儲(chǔ)跋炕,相比conf等配置文件要更簡(jiǎn)潔赖晶。

YAML 語(yǔ)法

  • 支持的數(shù)據(jù)類型:
    字典、列表、字符串遏插、布爾值捂贿、整數(shù)、浮點(diǎn)數(shù)胳嘲、Null厂僧、時(shí)間等
  • 基本語(yǔ)法規(guī)則:
    1、大小寫(xiě)敏感
    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)的餐济,讀寫(xiě)時(shí)并沒(méi)有報(bào)錯(cuò)耘擂!

安裝第三方y(tǒng)aml文件處理庫(kù)PyYAML

python沒(méi)有自帶的處理yaml文件的庫(kù),需要下載第三方庫(kù)PyYAML 或 ruamel.yaml 絮姆,這里我們安裝PyYAML醉冤。

pip install pyyaml
# 下載速度慢的話加上清華鏡像源
pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

讀取yaml文件

一,從yaml中讀取字典

yaml中的字典格式如下:

# yaml文件滚朵,文件名為yamlData

os: Android
osVersion: 10
account:
  username: xiaoqq
  password: 123456
deviceName: null
appPackage: ~
bool1: True

讀取字典代碼:

# @author: 給你一頁(yè)白紙

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冤灾,讀取出來(lái)的數(shù)據(jù)不會(huì)改變?cè)瓟?shù)據(jù)類型前域,即yaml里是什么數(shù)據(jù)類型辕近,讀出來(lái)就是什么類型。
2匿垄,Loader=yaml.FullLoader參數(shù)不寫(xiě)的話對(duì)結(jié)果不會(huì)有影響移宅,但運(yùn)行時(shí)會(huì)出現(xiàn)警告信息。
3椿疗,yaml.load(f.read(), Loader=yaml.FullLoader)也可以寫(xiě)成yaml.load(f, Loader=yaml.FullLoader)漏峰,讀取出來(lái)的結(jié)果相同。

二届榄,從yaml中讀取list

yaml中l(wèi)ist格式:數(shù)據(jù)前加'-' 并使用空格與數(shù)據(jù)間隔開(kāi)浅乔,如下:

# yaml文件名yamlData

- Android
- 10
- null
- ~
- True

讀取list代碼:

# @author: 給你一頁(yè)白紙

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'>
三,從yaml中讀取元組

yaml中存儲(chǔ)元組格式:yaml中使用!!對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,yaml中tuple由list轉(zhuǎn)換而來(lái)靖苇。如下:

# yaml文件名yamlData

!!python/tuple
- Android
- 10
- null
- ~
- True

讀取元組代碼:

# @author: 給你一頁(yè)白紙

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}
四贤壁,從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)語(yǔ)句獲取每組數(shù)據(jù)。代碼如下:

# @author: 給你一頁(yè)白紙

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

寫(xiě)入yaml文件

一名船,單組數(shù)據(jù)寫(xiě)入yaml文件

使用yaml.dump()方法绰上,加入allow_unicode=True參數(shù)防止寫(xiě)入的中文亂碼,如下:

# @author: 給你一頁(yè)白紙

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)

寫(xiě)入結(jié)果:

data:
- id: 1
  name: 學(xué)校
- id: 2
  name: 公寓
- id: 3
  name: 流動(dòng)人口社區(qū)
msg: 地址
page: 1
二渠驼,多組數(shù)據(jù)寫(xiě)入yaml文件

使用yaml.dump_all()方法渔期,如下:

# @author: 給你一頁(yè)白紙

import yaml

apiData1 = {
   "page": 1,
   "msg": "地址",
   "data": [{
      "id": 1,
      "name": "學(xué)校"
   }, {
      "id": 2,
      "name": "公寓"
   }, {
      "id": 3,
      "name": "流動(dòng)人口社區(qū)"
   }],
}

apiData2 = {
   "page": 2,
   "msg": "地址",
   "data": [{
      "id": 1,
      "name": "酒店"
   }, {
      "id": 2,
      "name": "醫(yī)院"
   }, {
      "id": 3,
      "name": "養(yǎng)老院"
   }],
}

with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
   yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)

寫(xiě)入結(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庫(kù)之外,還有ruamel.yaml庫(kù)也可以對(duì)yaml文件進(jìn)行讀寫(xiě)操作渴邦,后續(xù)再記筆記進(jìn)行介紹疯趟。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋梭,隨后出現(xiàn)的幾起案子信峻,更是在濱河造成了極大的恐慌,老刑警劉巖瓮床,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盹舞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡隘庄,警方通過(guò)查閱死者的電腦和手機(jī)踢步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丑掺,“玉大人获印,你說(shuō)我怎么就攤上這事〗种荩” “怎么了兼丰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唆缴。 經(jīng)常有香客問(wèn)我鳍征,道長(zhǎng),這世上最難降的妖魔是什么面徽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任艳丛,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氮双。我一直安慰自己旺聚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布眶蕉。 她就那樣靜靜地躺著砰粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪造挽。 梳的紋絲不亂的頭發(fā)上碱璃,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音饭入,去河邊找鬼嵌器。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谐丢,可吹牛的內(nèi)容都是我干的爽航。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乾忱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讥珍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窄瘟,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衷佃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蹄葱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氏义,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年图云,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惯悠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竣况,死狀恐怖克婶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帕翻,我是刑警寧澤鸠补,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布萝风,位于F島的核電站嘀掸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏规惰。R本人自食惡果不足惜睬塌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揩晴,春花似錦勋陪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至劫映,卻和暖如春违孝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泳赋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工雌桑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祖今。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓校坑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親千诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耍目,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355