Python3操作YAML文件格式方法解析
數(shù)據(jù)及配置文件之爭(zhēng)
數(shù)據(jù)及文件通常有三種類型:
- 配置文件型:如ini,conf,properties文件,適合存儲(chǔ)簡(jiǎn)單變量和配置項(xiàng),最多支持兩層,不適合存儲(chǔ)多層嵌套數(shù)據(jù)
- 表格矩陣型:如csv,excel等,適合于存儲(chǔ)大量同類數(shù)據(jù),不適合存儲(chǔ)層級(jí)結(jié)構(gòu)的數(shù)據(jù)
- 多層嵌套型:如XML,HTMl,JSON、YAML,TOML等,適合存儲(chǔ)單條或少數(shù)多層嵌套數(shù)據(jù),不適合存儲(chǔ)大量數(shù)據(jù)
YAML兼容JSON格式,簡(jiǎn)潔,強(qiáng)大,靈活,可以很方便的構(gòu)造層級(jí)數(shù)據(jù)并快速轉(zhuǎn)為Python中的字典。
YAML簡(jiǎn)介
YAML(YAML Ain't Markup Language)即一種反標(biāo)記(XML)語(yǔ)言。強(qiáng)調(diào)數(shù)據(jù)為中心,而非標(biāo)記。YAML大小寫敏感,使用縮進(jìn)代表層級(jí)關(guān)系。
YAML中支持對(duì)象Object(對(duì)應(yīng)Python中的字典), 數(shù)組Array(對(duì)應(yīng)Python中的列表)以及常量(字符串、數(shù)字(int/float),true/false/null)。
相比于JSON格式,YAML免除了雙引號(hào),逗號(hào),大括號(hào),中括號(hào)等,(當(dāng)然也支持原始的JSON格式),并且支持注釋,類型轉(zhuǎn)換,跨行,錨點(diǎn),引用及插入等等。
基本格式
- 對(duì)象:使用key: value表示,冒號(hào)后面有一個(gè)空格,也可以是使用{key: value}(flow流格式)或{"key": "value"}表示
- 數(shù)組:使用- value表示,-后面有一個(gè)空格,每項(xiàng)一行,也可以使用[value1,value2,value3,...] (flow流格式)或["value1", "value2", "value3", ...]
- 字符串:abc或"abc"
- 數(shù)字:123或123.45
- true/false:true/false,TRUE/FALSE,True/False或on/off, ON/OFF, On/Off
- null: null,NULL, Null或~
示例文件demo.yaml:
# 注釋:示例yaml文件 name: Cactus age: 18 skills: - - Python - 3 - - Java - 5 has_blog: true gf: ~
相當(dāng)于以下JSON格式
{
"name": "Cactus",
"age": 18,
"skills": [
[
"Python",
3
],
[
"Java",
5
]
],
"has_blog": true,
"gf": null
}
類型轉(zhuǎn)換
使用!!str, !!float等可以將默認(rèn)類型轉(zhuǎn)為指定類型,如
- - !!float 3
- - !!str 4
- - !!str true
對(duì)應(yīng)JSON格式
[ 3.0, "4", "true" ]
多行文本及拼接
- | 保留多行文本(保留換行符)
- > 將多行拼接為一行
示例:
a: |
我
喜歡你b: >
我
不喜歡你
才怪對(duì)應(yīng)JSON格式
{
"a": "我\n喜歡你\n",
"b": "我 不喜歡你 才怪"
}
錨點(diǎn),引用及插入
在-或:后 加上&錨點(diǎn)名為當(dāng)前字段建立錨點(diǎn),下面可使用*錨點(diǎn)名引用錨點(diǎn),或使用<<: *錨點(diǎn)名直接將錨點(diǎn)數(shù)據(jù)插入到當(dāng)前的數(shù)據(jù)中,示例如下:
users: - &zs name: 張三 password: !!str 123456 - &ls name: 李四 password: abcdefg case1: login: *zs case2: user: <<: *ls age: 20
對(duì)應(yīng)JSON格式:
{
"users": [
{
"name": "張三",
"password": "123456"
},
{
"name": "李四",
"password": "abcdefg"
}
],
"case1": {
"login": {
"name": "張三",
"password": "123456"
}
},
"case2": {
"user": {
"name": "李四",
"password": "abcdefg",
"age": 20
}
}
}
Python操作YAML文件及字符串
需要安裝pyyaml, pip install pyyaml
和JSON文件類似,yaml也提供load和dump兩種方法。
- yaml.load()或yaml.safe_load(YAML字符串或文件句柄):yaml -> 字典,如yaml中有中文,需要使用 字符串.encode('utf-8')或打開文件時(shí)指定encoding='utf-8'
- yaml.dump(字典):默認(rèn)為flow流格式,即字典{b': {'c': 3, 'd': 4}},會(huì)被轉(zhuǎn)為b: {c: 3, d: 4}形式,可以使用default_flow_style=False關(guān)閉流模式
由于yaml.load()支持原生Python對(duì)象,不安全,建議使用yaml.safe_load()
示例1:yaml字符串 -> 字典
import yaml yaml_str = ''' name: Cactus age: 18 skills: - - Python - 3 - - Java - 5 has_blog: true gf: ~ ''' print(yaml.safe_load(yaml_str))
打印結(jié)果:
{'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
如果有中文,可以使用yaml.load(yaml_str.encoding('utf-8))
示例2:yaml文件 -> 字典
import yaml
with open('demo.yaml', encoding='utf-8') as f: # demo.yaml內(nèi)容同上例yaml字符串
print(yaml.safe_load(f))
打印結(jié)果同上例。
字典 -> yaml字符串或文件
import yaml
dict_var = {'name': 'Cactus', 'age': 18, 'skills': [['Python', 3], ['Java', 5]], 'has_blog': True, 'gf': None}
print(yaml.dump(dict_var,)) # 轉(zhuǎn)為字符串,使用默認(rèn)flow流格式
with open('demo5.yaml', 'w', encoding='utf-8') as f:
yaml.dump(dict_var, f, default_flow_style=False) # 寫入文件,不是用flow流格式
打印內(nèi)容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- [Python, 3]
- [Java, 5]
1demo5.yaml1文件內(nèi)容:
age: 18
gf: null
has_blog: true
name: Cactus
skills:
- - Python
- 3
- - Java
- 5
更多操作可參考pyyaml官方文檔:https://pyyaml.org/wiki/PyYAMLDocumentation
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Opencv簡(jiǎn)單圖像操作方法實(shí)戰(zhàn)
OpenCV是一個(gè)開源的計(jì)算機(jī)視覺庫(kù),它提供了一系列豐富的圖像處理和計(jì)算機(jī)視覺算法,這篇文章主要給大家介紹了關(guān)于Opencv簡(jiǎn)單圖像操作方法的相關(guān)資料,需要的朋友可以參考下2024-02-02
Python數(shù)據(jù)可視化之用Matplotlib繪制常用圖形
Matplotlib能夠繪制折線圖、散點(diǎn)圖、柱狀圖、直方圖、餅圖. 我們需要知道不同的統(tǒng)計(jì)圖的意義,以此來(lái)決定選擇哪種統(tǒng)計(jì)圖來(lái)呈現(xiàn)我們的數(shù)據(jù),今天就帶大家詳細(xì)了解如何繪制這些常用圖形,需要的朋友可以參考下2021-06-06
Python實(shí)現(xiàn)Windows鍵盤鼠標(biāo)自動(dòng)化模擬器
這篇文章主要為大家詳細(xì)介紹了一個(gè)基于Python的Windows鍵盤鼠標(biāo)自動(dòng)化模擬器,適合自動(dòng)化測(cè)試、游戲輔助等場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)定時(shí)壓縮指定文件夾發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)分類篇
這篇文章主要介紹了PyTorch一小時(shí)掌握之神經(jīng)網(wǎng)絡(luò)分類篇,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解
這篇文章主要介紹了Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05

