Python模塊之yaml:簡化配置與數據解析

37b9658de631a0da2c40e04870c955c6.jpeg

更多Python學習內容:ipengtao.com

YAML(YAML Ain't Markup Language)是一種人類可讀的數據序列化格式,常用于配置文件和數據傳輸。在Python中,可以使用PyYAML模塊來處理YAML格式的數據。本文將深入介紹PyYAML的基礎用法、高級功能以及實際應用場景,以幫助讀者更好地利用YAML在項目中簡化配置與數據解析。

安裝與基礎用法

首先,確保已經安裝了PyYAML模塊,可以通過以下命令進行安裝:

pip?install?pyyaml

安裝完成后,將深入介紹PyYAML的基礎用法。首先,加載一個YAML文件并訪問其中的數據:

import?yaml#?從YAML文件加載數據
with?open("example.yaml",?"r")?as?file:data?=?yaml.load(file,?Loader=yaml.FullLoader)print(data)

上述代碼使用yaml.load函數加載了一個YAML文件,其中Loader=yaml.FullLoader用于選擇完整的加載器。

將Python對象轉為YAML格式:

import?yaml#?將Python對象轉為YAML格式
python_object?=?{'name':?'John',?'age':?30,?'city':?'New?York'}
yaml_data?=?yaml.dump(python_object)
print(yaml_data)

這段代碼使用yaml.dump函數將一個Python字典轉為YAML格式的字符串。

高級功能與參數解析

在使用PyYAML的高級功能時,可以通過一些參數和技巧來處理更為復雜的數據結構。以下是一些高級功能和參數解析的示例:

1. 自定義標簽

import?yaml#?定義一個自定義標簽的構造器
def?custom_constructor(loader,?node):return?f"Custom?Tag:?{node.value}"#?添加自定義標簽的構造器
yaml.add_constructor('!custom_tag',?custom_constructor)#?使用自定義標簽
data?=?yaml.load('custom_data:?!custom_tag?example',?Loader=yaml.FullLoader)
print(data)

在上述代碼中,定義了一個自定義標簽的構造器custom_constructor,并通過yaml.add_constructor方法將其與標簽!custom_tag關聯。然后,我們在YAML數據中使用了這個自定義標簽。

2. Anchor與Alias

import?yaml#?創建一個帶有錨點的數據結構
data?=?{'&anchor1':?{'name':?'John',?'age':?30},?'*alias1':?None}#?將數據轉為YAML格式
yaml_data?=?yaml.dump(data)
print(yaml_data)#?加載帶有錨點和別名的YAML數據
loaded_data?=?yaml.load(yaml_data,?Loader=yaml.FullLoader)
print(loaded_data)

上述代碼中,創建了一個帶有錨點和別名的數據結構,并通過yaml.dump方法將其轉為YAML格式。在加載時,yaml.load方法能夠正確處理錨點和別名,保持數據結構的一致性。

3. 多文檔處理

import?yaml#?使用多文檔YAML格式
yaml_data?=?"""
-?name:?Johnage:?30
-?name:?Aliceage:?25
"""#?加載多文檔YAML數據
loaded_data?=?list(yaml.load_all(yaml_data,?Loader=yaml.FullLoader))
print(loaded_data)

在上述代碼中,使用了多文檔的YAML格式,通過yaml.load_all方法加載了多個文檔。這對于處理包含多個獨立數據塊的YAML文件非常有用。

實際應用場景

在實際項目中,PyYAML可以應用于多種場景,以下是一些具體的應用案例:

1. 配置文件的讀寫

import?yaml#?定義配置數據
config_data?=?{'database':?{'host':?'localhost',?'port':?3306,?'username':?'user',?'password':?'pass'}}#?將配置數據寫入YAML文件
with?open('config.yaml',?'w')?as?file:yaml.dump(config_data,?file)#?從YAML文件讀取配置數據
with?open('config.yaml',?'r')?as?file:loaded_config?=?yaml.load(file,?Loader=yaml.FullLoader)print(loaded_config)

在這個例子中,將配置數據寫入YAML文件,并通過yaml.load方法從文件中讀取配置數據。這種方式使得配置文件的管理更為直觀和易于維護。

2. 數據傳遞與解析

import?yaml#?定義復雜數據結構
data?=?{'users':?[{'name':?'John',?'age':?30},?{'name':?'Alice',?'age':?25}]}#?將數據轉為YAML格式字符串
yaml_data?=?yaml.dump(data)
print(yaml_data)#?從YAML格式字符串解析數據
loaded_data?=?yaml.load(yaml_data,?Loader=yaml.FullLoader)
print(loaded_data)

在這個例子中,將復雜的數據結構轉為YAML格式字符串,并通過yaml.load方法解析。這在數據傳遞和解析過程中提供了一種清晰且可讀性強的方式。

3. 配置文件的動態生成

import?yaml#?通過代碼動態生成配置文件
config_data?=?{'api_key':?'your_api_key',?'endpoint':?'https://api.example.com'}#?將配置數據寫入YAML格式字符串
yaml_data?=?yaml.dump(config_data)#?將YAML格式字符串保存為配置文件
with?open('dynamic_config.yaml',?'w')?as?file:file.write(yaml_data)

在這個例子中,通過代碼動態生成了配置文件內容,并將其保存為YAML格式的配置文件。這種方式適用于需要根據程序運行時狀態生成配置文件的場景。

性能優化與最佳實踐

在處理大型YAML文件時,為了確保性能和最佳實踐,以下是一些建議和策略:

1. 避免不必要的內存占用

import?yaml#?使用生成器(Generator)方式逐行讀取大型YAML文件
def?read_large_yaml(file_path):with?open(file_path,?'r')?as?file:for?document?in?yaml.load_all(file,?Loader=yaml.FullLoader):yield?document#?逐行讀取大型YAML文件并處理
for?document?in?read_large_yaml('large_data.yaml'):#?在這里處理每個文檔process_document(document)

通過使用生成器方式逐行讀取大型YAML文件,可以避免一次性加載整個文件到內存中,減小內存占用。

2. 使用合適的Loader

PyYAML庫提供了多個Loader,包括LoaderSafeLoaderFullLoader。在處理大型文件時,建議使用Loader=yaml.CLoader,它是LibYAML的C擴展版本,速度更快。

import?yaml#?使用LibYAML的C擴展版本進行加載
data?=?yaml.load(yaml_data,?Loader=yaml.CLoader)

3. 部分加載

如果YAML文件包含多個文檔,只需要其中的一部分,可以使用yaml.load_all逐個加載文檔,選擇性地處理需要的部分。

import?yaml#?逐個加載YAML文件的文檔
with?open('multi_document.yaml',?'r')?as?file:for?document?in?yaml.load_all(file,?Loader=yaml.FullLoader):if?need_to_process(document):process_document(document)

注意事項與錯誤處理

在使用PyYAML時,有一些注意事項和常見錯誤需要注意:

1. YAML文件格式

確保YAML文件的格式正確,包括正確的縮進、使用冒號分隔鍵值對等。不規范的格式可能導致解析錯誤。

#?正確的YAML格式
key1:?value1
key2:-?item1-?item2

2. 特殊字符轉義

注意在YAML文件中使用特殊字符時需要進行適當的轉義,以避免解析錯誤。

#?需要轉義的特殊字符
special_string:?"This?is?a?string?with?a?special?character:?\n"

3. 錯誤處理

在解析YAML文件時,使用tryexcept結構捕獲yaml.YAMLError以處理可能的解析錯誤。

import?yamltry:with?open('data.yaml',?'r')?as?file:data?=?yaml.load(file,?Loader=yaml.FullLoader)#?在這里處理成功解析的數據
except?yaml.YAMLError?as?e:print(f"YAML?parsing?error:?{e}")#?在這里處理解析錯誤

4. 安全性考慮

在處理不受信任的YAML數據時,考慮使用yaml.SafeLoader,以防止潛在的代碼注入和安全問題。

import?yamldata?=?yaml.load(yaml_data,?Loader=yaml.SafeLoader)

總結

PyYAML是一個強大而靈活的YAML解析庫,適用于多種場景,包括配置文件管理、數據傳遞與解析等。通過安裝與基礎用法的介紹,能夠迅速上手并開始使用該庫。深入了解高級功能與參數解析,包括自定義標簽、Anchor與Alias、多文檔處理等,有助于解決復雜數據結構的應用需求。實際應用場景展示了PyYAML在項目中的廣泛應用,不論是在Web開發、自動化腳本還是數據科學領域,都能展現其強大功能。性能優化與最佳實踐提供了處理大型YAML文件時的優化策略,確保代碼的高效執行。同時,通過注意事項與錯誤處理的總結,可以更好地應對在使用PyYAML時可能遇到的問題,確保數據解析過程的順利進行。

總體而言,掌握了PyYAML的基礎與高級用法,結合實際案例的應用,將能夠更加熟練地處理和解析YAML格式的數據,提高項目的靈活性和可維護性。在使用該庫時,遵循最佳實踐,注意安全性和錯誤處理,將有助于確保項目的穩定性和可靠性。

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!

更多Python學習內容:ipengtao.com

干貨筆記整理

? 100個爬蟲常見問題.pdf ,太全了!

Python 自動化運維 100個常見問題.pdf

Python Web 開發常見的100個問題.pdf

124個Python案例,完整源代碼!

PYTHON 3.10中文版官方文檔

耗時三個月整理的《Python之路2.0.pdf》開放下載

最經典的編程教材《Think Python》開源中文版.PDF下載

fe3d0c645e769109b26d563238836f71.png

點擊“閱讀原文”,獲取更多學習內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣H指數——簡約做法

Problem: 274. H 指數 文章目錄 思路解題方法復雜度Code 思路 最后的結果一定不會超過下標個數。應為文章也要大于這個h,h超過了文章總數,就永遠不會存在這么多的文章滿足條件,所以只需要循環下標,那么最后的結果呢? 解…

AI質差小區優化效果評估

1. 下行流量/PRB利用率和貶損用戶的關系 通過分析長期貶損質差小區:下行PRB利用率/流量和小區平均每小時質差用戶數成正比例關系,即小區的貶損用戶會隨PRB利用率/流量的增長而增長。 2. 貶損用戶和流量走勢 年前平均每天流量平穩的情況下,通…

關于JS stack trace解決辦法

問題描述 npm run serve啟動前端項目時&#xff0c;控制臺輸出下圖一堆的文字&#xff0c;JS stack trace , 問題現象&#xff1a; JS stack trace Security context: 0000017B93ACFB61 <JS Object>1: init_scope_vars [0000017B93A04381 <undefined>:~3382] [p…

LightPicture - 企業/團隊圖床系統安裝搭建教程說明文檔

LightPicture - 企業/團隊圖床系統安裝搭建教程說明文檔 使用thinkphpvue開發&#xff0c;前后端分離&#xff1b;根據安裝教程安裝即可使用&#xff1b; 程序功能 ?支持第三方云儲存&#xff0c;本地、阿里云OSS、騰訊云COS、七牛云KODO、又拍云USS、華為云OBS等等 ?支持多…

60V/80V/90V降12V降5V 3A4A電流DCDC同步降壓芯片

60V/80V/90V降12V降5V 3A4A電流DCDC同步降壓芯片WD5105 一、概述 WD5105是一種高性能的DCDC同步降壓芯片&#xff0c;適用于將60V/80V/90V的電壓降至12V和5V&#xff0c;并可提供高達3A4A的電流。這款芯片具有高效率、低噪聲、高穩定性等優點&#xff0c;適用于各種需要高電壓…

如何在3dMax中實現創建對象時自動指定材質?

如何在3dMax中實現創建對象時自動指定材質&#xff1f; 我們在某些情況下是否希望為創建的對象指定默認材質呢&#xff1f;如果有這樣的需求請不用擔心&#xff0c;解決方案就在這里啦。它并不有多么復雜&#xff0c;但展示了如何使用NodeEventCallback在使用此回調系統的節點上…

北京數字孿生賦能工業制造,加速推進制造業數字化轉型

隨著新一代信息技術與實體經濟深度融合進程的加快&#xff0c;企業數字化轉型需求的提升&#xff0c;政策的持續支持&#xff0c;數字孿生將為工業制造、未來生活帶來無限的可能。在制造業數字化大變革時代&#xff0c;以5G、大數據、物聯網、人工智能等為代表的工業4.0&#x…

vue2-axios

下載axios 開發版本&#xff1a;axios.js 生產版本&#xff1a;axios.min.js 搭建服務器&#xff1a;json-server npm i -g json-serverjson-server --watch db.json&#xff08;啟動服務并讀取文件&#xff0c;db.json文件目錄下啟動&#xff09; json-server --watch db.j…

Redis-Redis高可用集群之水平擴展

Redis3.0以后的版本雖然有了集群功能&#xff0c;提供了比之前版本的哨兵模式更高的性能與可用性&#xff0c;但是集群的水平擴展卻比較麻煩&#xff0c;今天就來帶大家看看redis高可用集群如何做水平擴展&#xff0c;原始集群(見下圖)由6個節點組成&#xff0c;6個節點分布在三…

基于DCT變換的圖像壓縮解壓縮算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1、DCT變換原理 4.2、基于DCT的圖像壓縮 4.3、基于DCT的圖像解壓縮 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 MATLAB2022a 3.部分核心程序 ...................…

動態loading

項目中需要用到動圖loading的地方可以下載 https://www.intogif.com/loading/ 高級點的還有css動畫;692 Loaders: CSS & Tailwind 692 Loaders: CSS & Tailwind

【Python】np.unique() 介紹與使用

簡述 numpy.unique&#xff1a;用于去除數組中重復元素&#xff0c;并從小到大排序&#xff08;找到唯一元素并排序&#xff09;。 def unique(ar, return_indexFalse, return_inverseFalse,return_countsFalse, axisNone):ar: 這是輸入的數組或類數組對象。return_index: 如…

【數字信號處理】傅里葉變換的離散性與周期性

傅里葉變換的離散性與周期性 2023年11月21日 #elecEngeneer 文章目錄 傅里葉變換的離散性與周期性1. 符號說明2. 具體分析3. 序列的序號表示的DFT下鏈 1. 符號說明 t : 連續時間(時域)變量 ω : 頻域變量&#xff0c;aka角頻率 g : 時域函數 G : 頻域函數 n : 時域采樣序列序號…

MAV3D:從文本描述中生成三維動態場景

Singer U, Sheynin S, Polyak A, et al. Text-to-4d dynamic scene generation[J]. arXiv preprint arXiv:2301.11280, 2023. MAV3D 是 Meta AI 研究者們提出的一種從文本描述生成三維動態場景的方法。從所提供的文本生成的動態視頻輸出可以從任何攝像機位置和角度查看&#xf…

Rust語言入門教程(一) - 簡介及Cargo使用

Rust編程入門 為什么學習Rust 我本人是一個DevOps工程師&#xff0c;并不是專職的開發人員&#xff0c;但需要了解各種各樣的語言的基本知識和特性&#xff0c;以便在不同的項目中幫助開發人員設計軟件架構&#xff0c;部署流程以及進行錯誤排查和調試。但是對任何新生的優秀…

springboot 外部化配置

背景:修改jar包中的配置比較麻煩 項目部署的時候放一個配置文件在jar包外 配置文件優先級: 1.jar包內的application.properties/yaml 2.jar包內的application-{profile}.properties/yaml 3.jar包外的application.properties/yaml 4.jar包外的application-{profile}.properties…

【算法】緩存淘汰算法

目錄 1.概述2.代碼實現2.1.FIFO2.2.LRU2.3.LFU2.4.Clock2.5.Random 3.應用 1.概述 緩存淘汰策略是指在緩存容量有限的情況下&#xff0c;當緩存空間不足時決定哪些緩存項應當被移除的策略。緩存淘汰策略的目標是盡可能地保持緩存命中率高&#xff0c;同時合理地利用有限的緩存…

(保姆級教程)Mysql中事務的概念,什么是事務,如何使用事務,以及事務的隔離級別,什么是臟讀、幻讀,代碼演示

繼續講解 Mysql 數據庫中最重要的一個概念&#xff1a;事務 文章目錄 事務1.1 什么是事務1.2 執行原理1.3 如何操作事務1.4 事務的特點&#xff08;ACID原則&#xff09;1.5 事務并發1.6 事務隔離級別1.6.1 事務并發問題操作演示1.6.2 臟讀演示1.6.3 不可重復讀演示1.6.4 幻讀演…

二叉樹的順序結構及實現

目錄 1 二叉樹的順序結構2. 堆的概念及結構3 .堆的實現(小堆) 1 二叉樹的順序結構 普通的二叉樹是不適合用數組來存儲的&#xff0c;因為可能會存在大量的空間浪費。而完全二叉樹更適合使用順序結構存儲。現實中我們通常把堆(一種二叉樹)使用順序結構的數組來存儲&#xff0c;…

【Pytorch】Visualization of Feature Maps(3)

學習參考來自&#xff1a; Image Style Transform–關于圖像風格遷移的介紹github&#xff1a;https://github.com/wmn7/ML_Practice/tree/master/2019_06_03 文章目錄 風格遷移 風格遷移 風格遷移出處&#xff1a; 《A Neural Algorithm of Artistic Style》&#xff08;ar…