一、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+模式