Python YAML文件的讀寫(xiě)操作詳解
YAML是一種數(shù)據(jù)序列化格式,方便人類(lèi)閱讀,且容易和腳本語(yǔ)言交互。常用于配置文件,也用于數(shù)據(jù)存儲(chǔ)或傳輸。
YAML格式
YAML三種基本數(shù)據(jù)類(lèi)型:
1.標(biāo)量:如字符串、整數(shù)和浮點(diǎn)數(shù)、日期
- 布爾值:“true”、“True”、“TRUE”、“yes”、“Yes"和"YES”,“false”、“False”、“FALSE”、“no”、“No"和"NO”
- 空:null、Null、
~
或不指定值;
2.數(shù)組:使用前導(dǎo)符號(hào)-
表示,且符號(hào)與值間要有空格;
3.對(duì)象:鍵值對(duì)集合;用冒號(hào)+空格:
分割;
YAML文件
文件基本規(guī)則:
區(qū)分大小寫(xiě);
使用縮進(jìn)表示層級(jí)關(guān)系:
- 縮進(jìn)要用空格(非Tab);
- 相同層級(jí)元素要左對(duì)齊;
字符串不需要使用引號(hào)括起,但有特殊字符串(如空格、冒號(hào)等)時(shí)必須使用引號(hào);
使用#
注釋?zhuān)?/p>
一個(gè)文件中可包含多份YAML文檔:
用---
(即三個(gè)中劃線)表示一份文檔的開(kāi)始;
[可選]用...
(即三個(gè)小數(shù)點(diǎn))表示一份文檔的結(jié)束;
---
# 這是第一份文檔
one: 1
# 其他內(nèi)容...
...---
# 這是第二份文檔
two: 2
# 其他內(nèi)容...
YAML操作
Python中有兩個(gè)YAML模塊:PyYAML和ruamel.yaml(pip3 install pyyaml
,pip3 install ruamel.yaml
)。
讀取
通過(guò)load函數(shù)可方便加載文檔內(nèi)容,返回的內(nèi)容可能是字典、列表或空:
import yaml def readYaml(file): # -> Union[dict, list, None]: with open(file, 'r', encoding='utf-8') as f: return yaml.load(f, yaml.Loader)
若文件中有多個(gè)文檔,需要使用load_all來(lái)加載;此時(shí)返回的是一個(gè)生成器,需要一次獲取每個(gè)文檔:
def readAllDoc(file) -> list: with open(file, 'r', encoding='utf-8') as f: docs = yaml.load_all(f, yaml.Loader) # return [d for d in docs] return list(docs)
存儲(chǔ)
yaml.dump()方法不會(huì)將列表或字典數(shù)據(jù)進(jìn)行轉(zhuǎn)化yaml標(biāo)準(zhǔn)模式。需要通過(guò)ruamel.yaml來(lái)生成標(biāo)準(zhǔn)的yaml文檔。
import ruamel.yaml def createYaml(file, data: dict): with open(file, 'w', encoding='utf-8') as f: writer = ruamel.yaml.YAML() writer.indent(mapping=2, sequence=4, offset=2) writer.dump(data, f)
通過(guò)dump_all可把數(shù)組中的每個(gè)元素序列化為一個(gè)文檔:
def createAllDoc(file, data: list): with open(file, 'w', encoding='utf-8') as f: writer = ruamel.yaml.YAML() writer.indent(mapping=2, sequence=4, offset=2) writer.dump_all(data, f)
把[{'name': 'Mike', 'age': 12}, {'name': 'luce', 'age': 15}]
序列化。
dump會(huì)生成如下包含數(shù)組元素的yaml文件:
- name: Mike age: 12 - name: luce age: 15
dump_all會(huì)生成如下yaml文件(包含兩個(gè)文檔):
name: Mike age: 12 --- name: luce age: 15
示例
yaml讀取后為列表或字典。
轉(zhuǎn)字典
讀取的內(nèi)容為一個(gè)字典:
name: mike age: 25 score: 80.5
返回的值為:
{
"name": "mike",
"age": 25,
"score": 80.5
}
獲取里面值,先判斷是否存在,再讀?。?/p>
if 'name' in data: print(data['name'])
轉(zhuǎn)列表
讀取內(nèi)容為一個(gè)列表:
- name: mike age: 24 - name: tom age: 30
返回的值為:
[
{
"name": "mike",
"age": 24
},
{
"name": "tom",
"age": 30
}
]
到此這篇關(guān)于Python YAML文件的讀寫(xiě)操作詳解的文章就介紹到這了,更多相關(guān)Python YAML文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows+vscode安裝paddleOCR運(yùn)行環(huán)境的步驟
這篇文章主要介紹了windows+vscode安裝paddleOCR運(yùn)行環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Python報(bào)mongod:?error?while?loading?shared?libraries:?l
這篇文章主要介紹的是Python報(bào)mongod:?error?while?loading?shared?libraries:?libcrypto.so.1.1的解決方法,下面文章解決過(guò)程,需要的小伙伴可以參考一下2022-02-02Python中的 No Module named ***問(wèn)題及解決
這篇文章主要介紹了Python中的 No Module named ***問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07全網(wǎng)最細(xì) Python 格式化輸出用法講解(推薦)
這篇文章主要介紹了全網(wǎng)最細(xì) Python 格式化輸出用法講解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python爬蟲(chóng)實(shí)現(xiàn)(偽)球迷速成
還有4天就世界杯了,作為一個(gè)資深(偽)球迷,必須要實(shí)時(shí)關(guān)注世界杯相關(guān)新聞,了解各個(gè)球隊(duì)動(dòng)態(tài),下面小編給大家?guī)?lái)了Python爬蟲(chóng)實(shí)現(xiàn)(偽)球迷速成功能,一起看看吧2018-06-06Python3.7 pyodbc完美配置訪問(wèn)access數(shù)據(jù)庫(kù)
最近小編需要學(xué)習(xí)python連接access數(shù)據(jù)庫(kù),發(fā)現(xiàn)很多朋友推薦pyodbc,那么這篇文章就先為大家介紹一下Python3.7下pyodbc的配置方法2019-10-10Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié)
這篇文章主要介紹了Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié),需要的朋友可以參考下2018-02-02