Python 讀寫 yaml 文件


一、yaml文件規則

  • 區分大小寫;
  • 使用縮進表示層級關系;
  • 使用空格鍵縮進,而非Tab鍵縮進
  • 縮進的空格數目不固定,只需要相同層級的元素左側對齊;
  • 文件中的字符串不需要使用引號標注,但若字符串包含有特殊字符則需用引號標注;
  • 注釋標識為#

二、yaml數據結構

  • YAML 支持的數據結構有三種。
  • 對象
鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
對象的一組鍵值對,使用冒號結構表示。
  • 數組
一組按次序排列的值,又稱為序列(sequence) / 列表(list)
一組連詞線開頭的行,構成一個數組。
  • 純量(scalars)
單個的、不可再分的值
包括字符串,布爾值,整數,浮點數,Null,時間,日期

三、一個yaml文件

name: LeBron James
age: 37
spouse:
  name: LeBron James
  age: 37
children:
  - LeBron James Jr
    age: 18
  - Bryce Maximus James
    age: 15

和它對應的json文件如下:

{ name: 'LeBron James',
  age: 37,
  spouse: { name: 'LeBron James', age: 37 },
  children: 
   [ { name: 'LeBron James Jr', age: 18 },
     { name: 'Bryce Maximus James', age: 15 } ] 
}

四、通常 Python 使用的 Yaml 文件處理的包有 2 個。

可以理解為 PyYAML 是 Python 自帶的 Yaml 數據處理庫,ruamel.yaml 是 PyYAML 的增強版。因此使用 ruamel.yaml 的會比較多,而且很多語法和函數都是通用的。

安裝

PyYAML 和 ruamel.yaml 都需要安裝。使用 pip install 進行安裝就可以了。過程非常簡單。

pip install pyyaml 
pip install ruamel.yaml

五、用原生的pyyaml模塊寫入字典嵌套字典的復雜數據

import yaml

desired_caps = {
    'platformName': 'Android',  # 被測手機是安卓
    'platformVersion': 'platformVersion',  # 手機安卓版本
    'deviceName': 'deviceName',  # 設備名,安卓手機可以隨意填寫
    'appPackage': 'com.mobivans.onestrokecharge',  # 啟動APP Package名稱
    'appActivity': 'com.mobivans.onestrokecharge.activitys.MainActivity',  # 啟動Activity名稱
    'unicodeKeyboard': True,  # 使用自帶輸入法,輸入中文時填True
    'resetKeyboard': True,  # 執行完程序恢復原來輸入法
    'noReset': True,  # 不要重置App
    'newCommandTimeout': 60000,
    'udid': {"devicesname":"127.0.0.1:62001"}
}

# 將以上字典寫入到yaml文件
with open('desired_caps.yaml', 'w', encoding='utf-8') as f:
    # 將字典寫入到yaml文件中
    yaml.dump(desired_caps, f)

六、ruamel.yaml寫入

使用方法跟yaml差不多,只是在使用dump方法多個一個參數:Dumper=yaml.RoundTripDumper

from ruamel import yaml

desired_caps = {
    'platformName': 'Android',  # 被測手機是安卓
    'platformVersion': 'platformVersion',  # 手機安卓版本
    'deviceName': 'deviceName',  # 設備名,安卓手機可以隨意填寫
    'appPackage': 'com.mobivans.onestrokecharge',  # 啟動APP Package名稱
    'appActivity': 'com.mobivans.onestrokecharge.activitys.MainActivity',  # 啟動Activity名稱
    'unicodeKeyboard': True,  # 使用自帶輸入法,輸入中文時填True
    'resetKeyboard': True,  # 執行完程序恢復原來輸入法
    'noReset': True,  # 不要重置App
    'newCommandTimeout': 60000,
    'udid': {"devicesname":"127.0.0.1:62001"}
}

# 將以上字典寫入到yaml文件
with open('desired_caps.yaml', 'w', encoding='utf-8') as f:
    # 將字典寫入到yaml文件中
    yaml.dump(desired_caps, f, Dumper=yaml.RoundTripDumper)

注意:如果不加Dumper=yaml.RoundTripDumper,寫入的時候有字典的嵌套,例如上述字典中udid字段,出現了大括號:{androidProcess: 'com.tencent.mm:tools'},這不是真正的yaml數,如下圖

 

 那么加上Dumper=yaml.RoundTripDumper寫入的內容形式如下

七、ruamel.yaml讀取yaml文件內容

使用ruamel.yaml模塊也能讀yaml文件,使用方法相對於之前的yaml.load方法多加一個參數:Loader=yaml.Loader

from ruamel import yaml

with open('desired_caps.yaml', 'r', encoding="utf-8") as f:
    # yaml文件中讀取內容
    msg = yaml.load(f.read(), Loader=yaml.Loader)
    print(msg)
    # 查看數據類型--》字典
    print('讀取出來數據類型為:', type(msg))

八、寫入中文到yaml文件中

from ruamel import yaml

# 將字典添加到yaml文件中
data = {'name': '金毛獅王'}

# 將以上字典寫入到yaml文件
with open('desired_caps.yaml', 'w', encoding='utf-8') as f:
    # 將字典寫入到yaml文件中
    yaml.dump(data, f, Dumper=yaml.RoundTripDumper)

運行后,查看yaml文件發現中文字符被轉碼成下面這種情況了

 

 那么怎么解決上述問題呢?只需要在后面添加allow_unicode=True即可

from ruamel import yaml

# 將字典添加到yaml文件中
data = {'name': '金毛獅王'}

# 將以上字典寫入到yaml文件
with open('desired_caps.yaml', 'w', encoding='utf-8') as f:
    # 將字典寫入到yaml文件中
    yaml.dump(data, f, Dumper=yaml.RoundTripDumper, allow_unicode=True)

再次查看如下:

 

 注意:以上內容,如果是追加寫入,則需要改變文件方式為,例如使用a+模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM