Python YAML 解析器

在本教程中,我們將學習如何使用 Python 對 YAML 文件進行讀取、寫入或執行各種操作。我們將討論 YAML 文件格式,它的用法,以及我們如何使用 Python 操作它。

讓我們簡單介紹一下 YAML。

什麼是 YAML?

YAML 是另一種標記語言的縮寫。它以序列化的方式存儲配置文件數據;由於它是一種人類可讀的數據格式,並且經常用於數據存儲或傳輸,因此近年來它變得非常流行。

YAML 支持三種數據類型——標量(字符串、整數和浮點)、列表和關聯數組。

YAML 文件與一起保存。yaml 或。yml 擴展。我們可以使用 YAML 的注釋,使用#符號。內部每個子項前面都有一個連字符。可以使用縮進來嵌套這些值。

YAML 的優勢

YAML 的一些重要優勢如下。

  • 所有編程語言都支持 YAML – 我們需要用一種語言寫 YAML,幾乎可以和所有編程語言一起使用,無需任何修改。
  • 對象序列化- 我們可以序列化 YAML 數據格式。
  • 易讀- 沒有硬寫的規則來創建 YAML 文件。簡單的縮進用於定義單個塊和文檔。

在進一步開始之前,我們假設您對 Python 有基本的了解,或者對 Python 編程語言有初級編程經驗。

PyYAML 模塊

PyYAML 是一個 Python 模塊,它提供了一系列方法來對 YAML 文件執行一些操作。我們可以很容易地將 YAML 文件轉換成字典並閱讀其內容。在 YAML 模塊的幫助下,我們可以讀寫複雜的配置 YAML 文件,序列化和持久化 YAML 數據。

要使用 PyYAML,我們需要在系統中安裝它。下面是 PyYAML 模塊的安裝步驟。

安裝 PyYAML

我們可以用下面的方法安裝它。

  • 使用 pip 命令安裝
  • 通過源代碼安裝

使用畫中畫命令

我們可以使用 pip 命令安裝它。在終端中鍵入以下命令來安裝 PyYAML 模塊。


pip install pyyaml

通過源代碼安裝

如果使用 pip 命令遇到錯誤,我們可以使用另一種安裝方式。遵循以下說明。

  • 打開 PyYAML Github 資源庫,點擊代碼段,下載 ZIP 文件。
  • 提取下載的壓縮文件。
  • 現在打開終端,更改解壓 zip 文件的目錄。
  • 現在運行一個 python setup.py 命令,然後點擊 enter 按鈕。它會在你的機器上安裝 PyYAML 模塊。

閱讀 YAML 文件

首先,我們創建一個名為 sample.yaml 的新 YAML 文件,該文件將用於使用 PyYAML 模塊進行讀取。

樣品 py


# YAML Document starts with ---
# Comments start with #
UserName: Antonio
Password: fire123 * 
phone: 9879098
Skills:
      -Python
      -SQL
      -Django
      -Rest Framework
      -JavaScript 

使用 yaml.load() 方法讀取 yaml 文件。這個方法解析 YAML 對象並將其轉換成 Python 字典,這樣我們就可以輕鬆地閱讀內容。這個過程被稱為將 YAML 文件反序列化為 Python。

load()方法接受一個參數,該參數可以是字節字符串、打開的二進制文件對象、Unicode 字符串或打開的 YAML 文件對象。

如果我們將文件或字節字符串作為參數傳遞,它應該用 utf-8、utf-16-be 或 utf-16-le 編碼。

讓我們理解下面的例子。

示例-


import yaml

from yaml.loader import SafeLoader
#open yaml file in read mode
with open('sample.yaml', 'r') as f:
    data = list(yaml.load(f, Loader=SafeLoader))
    print(data)

輸出:

[{'UserName': 'Antonio', 'Password': 'fire123 *', 'phone': 9879098, 'Skills': '-Python -SQL -Django -Rest Framework -JavaScript'}]

解釋-

我們已經將上面代碼中的 yaml 文件導入了 YAML 及其加載器。 load() 功能附帶了四種類型的 Loader。

  • 安全加載器- 我們在上面的例子中使用了這個加載器。它安全地裝載了 YAML 的一部分。當輸入來自不受信任的來源時,通常使用它。
  • baseliloader-它將所有基本的 YAML 標量加載為字符串。
  • FullLoader – 它的工作原理與 BaseLoader 相同,但避免了任意代碼執行。如果輸入來自不受信任的來源,則可能構成安全威脅。
  • unseloader-不可信源輸入推薦 Loader,一般用於向後兼容。

load() 方法返回我們鍵入列表中的生成器對象,可以訪問任何元素。

我們也可以通過字典的形式得到相同的值。讓我們理解下面的例子。

我們也可以通過字典的形式得到 yaml 值。讓我們理解下面的例子。

示例- 2


import yaml

from yaml.loader import FullLoader
#open yaml file in read
with open('sample.yaml', 'r') as f:
    yaml_data = yaml.load(f, Loader=FullLoader)
    print(yaml_data)

輸出:

{'UserName': 'Antonio', 'Password': 'fire123 *', 'phone': 9879098, 'Skills': '-Python -SQL -Django -Rest Framework -JavaScript'}

我們將標量參數安全加載器更改為完全加載器,將 YAML 數據轉換為字典。這個加載器的優點是,我們不需要將加載的數據類型轉換成列表。

閱讀多份 YAML 文件

我們可以使用 yaml.load_all() 方法讀取多個 yaml 文檔。一個 YAML 文件可以有多個文檔。下面是單個文件中多個文檔的示例。

樣品。yaml


---
UserName: Antonio
Password: fire123 * 
phone: 9879098
Skills:
      -Python
      -SQL
      -Django
      -Rest Framework
      -JavaScript 
...

---
  UserName: Maino
  Password: fire123 * 
  phone: 9879098
  Skills:
      -Python
      -SQL
      -Django
      -Rest Framework
      -JavaScript 
...

---
  UserName: George
  Password: fire123 * 
  phone: 9879098
  Skills:
      -Python
      -SQL
      -Django
      -Rest Framework
      -JavaScript 
...

文檔以三個破折號(-)開始,以三個點(…)結束。讓我們理解下面的例子。

示例-


import yaml

from yaml.loader import SafeLoader
#open yaml file in read
with open('sample.yaml', 'r') as f:
    yaml_data = list(yaml.load_all(f, Loader=SafeLoader))
    print(yaml_data)

輸出:

[{'UserName': 'Antonio', 'Password': 'fire123 *', 'phone': 9879098, 'Skills': '-Python -SQL -Django -Rest Framework -JavaScript'}, {'UserName': 'Maino', 'Password': 'fire123 *', 'phone': 9879098, 'Skills': '-Python -SQL -Django -Rest Framework -JavaScript'}, {'UserName': 'George', 'Password': 'fire123 *', 'phone': 9879098, 'Skills': '-Python -SQL -Django -Rest Framework -JavaScript'}]

解釋-

load() 方法返回我們鍵入列表中的生成器對象,這樣我們就可以訪問任何元素。在前面的例子中,我們學習了如何讀取 YAML 文件。現在,我們將了解如何將數據轉儲到 YAML 文件中。

用 PyYAML 模塊寫 YAML 文件

將 Python 數據寫入 YAML 被稱為序列化。要將數據轉儲到 yaml 文件中,我們將使用 yaml.dump() 方法。讓我們理解下面的例子。

示例-


import yaml

# dict object
members = [{'User': 'Zoey', 'Password': 'Xavier@123', 'Phone': 345464, 'Skills': ['Python', 'SQL', 'Django', 'Rest Framework', 'JavaScript']},
           {'name': 'Zaara', 'occupation': 'Dentist'}]

# Convert Python dictionary into a YAML document
print(yaml.dump(members))

輸出:

Password: [email protected]
  Phone: 345464
  Skills:
  - Python
  - SQL
  - Django
  - Rest Framework
  - JavaScript
  User: Zoey
- name: Zaara
  occupation: Dentist

解釋-

dump() 方法將 Python 對象轉換為 YAML 格式,並將它們寫入 YAML 文件。我們在上面的例子中做了同樣的事情。 dump() 方法接受兩個參數——數據和流。

數據參數表示將轉換成 YAML 流的 Python 對象。第二個參數是一個必須是文本或二進制文件的文件。YAML 流數據被寫入給定的文件名;否則, dump() 將返回生成的文檔。

讓我們理解在文件中寫入 Python 數據的例子。

示例- 2:


import yaml

# dict object
python_data = [{'User': 'Zoey', 'Password': 'Xavier@123', 'Phone': 345464, 'Skills': ['Python', 'SQL', 'Django', 'Rest Framework', 'JavaScript']},
           {'name': 'Zaara', 'occupation': 'Dentist'}]

with open('NewDetails.yaml', 'w') as f:
    data = yaml.dump(python_data, f, sort_keys=False, default_flow_style=False)

輸出:

新細節。yaml

- User: Zoey
  Password: [email protected]
  Phone: 345464
  Skills:
  - Python
  - SQL
  - Django
  - Rest Framework
  - JavaScript
- name: Zaara
  occupation: Dentist

解釋

在上面的例子中,首先,我們定義了要寫入文件的 Python 字典。然後,我們打開了新的細節。YAML 文件處於寫入模式。我們使用了 dump()方法,並將 Python dict 對象和另外兩個標籤一起傳遞。這些標籤是-

  • default_flow_style -用於以適當的縮進顯示嵌套塊的內容。默認為真。如果我們將其值設置為 false,並且嵌套列表中的值以流動樣式顯示,它將以適當的縮進顯示塊樣式的內容。
  • sort_keys -用於按字母順序排序按鍵。默認為真。如果我們將其值設置為 false,它將保持插入順序。

轉儲多個 YAML 文檔

yaml.dump_all() 方法用於將多個 yaml 文檔轉儲到一個流中。該方法將產生 Python 對象的列表或生成器序列化為 YAML 文檔,並將第二個可選參數作為打開的文件。

讓我們理解下面的例子。

示例-


import yaml

# dict object
python_data = [{'User': 'Zoey', 'Password': 'Xavier@123', 'Phone': 345464, 'Skills': ['Python', 'SQL', 'Django', 'Rest Framework', 'JavaScript']},
           {'name': 'Zaara', 'occupation': 'Software Engineer'}]

data1 = yaml.dump(python_data)
print("Using dump() method")
print(data1)

data2 = yaml.dump_all(python_data)
print("Using dump_all() method")
print(data2)

輸出:

Using dump() method
- Password: [email protected]
  Phone: 345464
  Skills:
  - Python
  - SQL
  - Django
  - Rest Framework
  - JavaScript
  User: Zoey
- name: Zaara
  occupation: Dentist

Using dump_all() method
Password: [email protected]
Phone: 345464
Skills:
- Python
- SQL
- Django
- Rest Framework
- JavaScript
User: Zoey
---
name: Zaara
occupation: Dentist

Python YAML 排序鍵

sort_keys 是將 Python 數據轉儲到文件中時使用的可選標記。如果我們將其設置為真,它將按字母順序對 YAML 文檔的所有鍵進行排序。讓我們理解下面的例子。

示例-


import yaml

from yaml.loader import FullLoader
#open yaml file in read
with open('sample.yaml', 'r') as f:

    print("Before Sorting?..")
    yaml_data = yaml.load(f, Loader=FullLoader)
    print(yaml_data)

    print("After Sorting......")
    sorted_data = yaml.dump(yaml_data, sort_keys=True)
    print(sorted_data)

輸出:

import yaml

from yaml.loader import FullLoader
#open yaml file in read
with open('sample.yaml', 'r') as f:

    print("Before Sorting?..")
    yaml_data = yaml.load(f, Loader=FullLoader)
    print(yaml_data)

    print("After Sorting......")
    sorted_data = yaml.dump(yaml_data, sort_keys=True)
    print(sorted_data)

YAML 文件格式

PyYaml 模塊提供了在 Yaml 文件中寫入 YAML 文檔時格式化該文件的功能。dump()方法支持各種格式參數。以下是格式參數。

參數-

  • 縮進- 有助於設置首選縮進。
  • 寬度- 有助於設置首選寬度。
  • canonical=True – 它強制標量和集合的首選樣式。

讓我們理解下面的例子-

示例-


import yaml

from yaml.loader import FullLoader
#open yaml file in read
with open('sample.yaml', 'r') as f:

    yaml_data = yaml.load(f, Loader=FullLoader)
    sorted_data = yaml.dump(yaml_data, indent=10, default_flow_style=False)
    print(sorted_data)

輸出:

Password: fire123 *
Skills: -Python -SQL -Django -Rest Framework -JavaScript
UserName: Antonio
phone: 9879098

自定義 Python 類 YAML 可序列化

我們可以創建自定義 Python 類,它可以將 YAML 轉換為自定義 Python 對象,而不是列表或內置類型。

讓我們理解下面的例子-

示例-


import yaml
from yaml.loader import UnsafeLoader

class Person:
    def __init__(self, user, password):
        self.user = user
        self.password = password

    def __repr__(self):
        return "%s(user=%r, password=%r)" % (
            self.__class__.__name__, self.user, self.password)

# Make Python Class YAML Serializable
person = Person('Jessa', 'queue@123')
yaml_obj = yaml.dump(person)

# Deserialize YAML into a Custom Python Class
new_person = yaml.load(yaml_obj, Loader=UnsafeLoader)
print(new_person.user, new_person.password)

輸出:

Jessa [email protected]

帶 PyYAML 的自定義標籤

我們可以根據應用需求創建自定義標籤,並在解析 YAML 文件時為自定義標籤分配默認值。為此,它涉及下面給出的某些步驟。

  • 在第一步中,我們定義一個構造器,該函數接受 loader 和 YAML 節點。
  • 我們在創建的構造器中調用construct _ mapping()方法,該方法將返回一個對應於 YAML 節點的 Python 字典。它將返回一個帶有字典的構造器。
  • 返回的構造器將被傳遞給 add_constructor() ,後者將 YAML 表示圖轉換為本機 Python 對象。一個構造器接受一個 Loader 實例,一個節點返回 Python 對象。
  • 現在,load()方法可以根據需要接受許多具有 add_constructor()中定義的相同自定義標記的字段。沒有值的字段將被分配在 init()方法中定義的默認值。

讓我們理解下面的例子。

示例-


import yaml

def custom_constructor(loader, node) :
    fields = loader.construct_mapping(node)
    return Test(**fields)

yaml.add_constructor('!Custom Tags', custom_constructor)

class Test(object) :

    def __init__(self, user, password, phone=11000) :
        self.user = user
        self.password = password
        self.phone = phone

    def __repr__(self):
        return "%s(user=%s, password=%r,phone=%r)" % (self.__class__.__name__, self.user, self.password, self.phone)

print (yaml.load("""
- !Custom Tags { user: 'Sam' }
- !Custom Tags { user: 'Gaby', password: 'admin@123',phone: 5656}"""))

輸出:

[Custom Tags(user=Sam, [email protected],phone=1100), Test(name=Gaby, password= [email protected], phone=5656)]

PyYAML 模塊中的轉換表

下面是 PyYAML 模塊用來將 Python 對象轉換成 YAML 等價對象的表格。 dump() 方法在編碼時使用翻譯。

| YAML 日 | Python 類型 |
| !!空 | 沒有人 |
| !!彎曲件 | 彎曲件 |
| !!漂浮物 | 浮動 |
| !!(同 Internationalorganizations)國際組織 | (同 Internationalorganizations)國際組織 |
| !!二進制的 | 字符串(Python3 中的字節) |
| !!時間戳 | 日期時間.日期時間 |
| !!奧馬普!!成對 | 配對列表 |
| !!設置 | 一組 |
| !!順序 | 目錄 |
| !!潛艇用熱中子反應堆(submarine thermal reactor 的縮寫) | 字符串或 unicode(Python 中字符串) |
| !!地圖 | 字典 |

YAML 錯誤

YAML 解析器在出現任何錯誤時都會引發一個名為的異常錯誤。藉助這個錯誤,我們可以調試這個問題。因此,建議在 try-expect 塊中使用 YAML 序列化代碼。讓我們理解下面的例子。

示例-


import yaml

try:
    config = yaml.load('Userdetails.yaml')
except yaml.YAMLError:
    print("Error in configuration file:")

代幣

令牌通常用於低級應用,如語法突出顯示。我們可以產生 scan() 方法來產生一組代幣。讓我們理解下面的例子。

示例-


import yaml

with open('sample.yaml') as f:
    data = yaml.scan(f, Loader=yaml.FullLoader)

    for token in data:
        print(token)

輸出:

StreamStartToken(encoding=None)
DocumentStartToken()
BlockMappingStartToken()
KeyToken()
ScalarToken(plain=True, style=None, value='UserName')
ValueToken()
ScalarToken(plain=True, style=None, value='Antonio')
KeyToken()
ScalarToken(plain=True, style=None, value='Password')
ValueToken()
ScalarToken(plain=True, style=None, value='fire123 *')
KeyToken()
ScalarToken(plain=True, style=None, value='phone')
ValueToken()
ScalarToken(plain=True, style=None, value='9879098')
KeyToken()
ScalarToken(plain=True, style=None, value='Skills')
ValueToken()
ScalarToken(plain=True, style=None, value='-Python -SQL -Django -Rest Framework -JavaScript')
BlockEndToken()
DocumentEndToken()
StreamEndToken()

Python YAML 到 XML

可以使用 XMLPlain 模塊將 YAML 數據轉換為 XML 格式。XML 是可擴展標記語言的縮寫名稱,它使用 HTML 標籤來定義標籤。

obj_from_yaml() 方法用於從 yaml 流或字符串生成 XML 普通對象。為了保持 XML 普通對象元素的有序,YAML 流被存儲為 OrderDict。

讓我們獲取包含員工詳細信息的 YAML 文件示例,並將其轉換為 XML 文件。

示例-


StudentRecord:
-Student:
    'rollno': st01
    name: Alexa
    class: 10
    subject: python, Java
-Student:
    'rollno': st02
    name: Prince
    class: 11
    subject: Webservices, REST API

讓我們理解代碼實現。

示例-


import xmlplain

# Read the YAML file
with open("student.yaml") as inf:
    root = xmlplain.obj_from_yaml(inf)

# Output back XML
with open("student.xml", "w") as outf:
    xmlplain.xml_from_obj(root, outf, pretty=True)

結論

在本教程中,我們學習了 YAML 和 PyYAML 模塊的一些重要概念。我們介紹了如何創建自定義標籤,將 YAML 文件的內容作為字典加載到 Python 程序中。我們還討論了如何操作 YAML 格式的文件。本教程包含了該庫相當簡短的基本功能。


原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271715.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 19:23
下一篇 2024-12-16 19:23

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論