程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

詳解Python的pyyaml模塊

編輯:Python

一:什麼是yaml

        yaml的英文名稱是Yet Another Markup Language,直譯過來就是標記語言。yaml用的比較多的地方就是寫配置文件,比如yaml配置文件在Kubernetes用的就非常廣泛,學Kubernetes必須要先學yaml文件格式。

        先簡單的介紹一下yanm的基本語法:

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進時不允許使用Tab鍵,只允許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • #表示注釋,從這個字符一直到行尾,都會被解析器忽略,這個和python的注釋一樣

 二:安裝pyyaml

        pyyaml是python的第三方庫,需要自己手動安裝才能使用

pip install pyyaml

         本次安裝的是pyyaml的6.0版本

 三:pyyaml的使用

 1,讀取yaml文件

        先看看已經准備好的yaml文件

一級標題:
二級標題1:
b:1
c:2
a:3
二級標題2:
f:7
t:8
z:9

 用yaml的load方法來加載一個yaml文件流,返回的是一個json對象

import yaml
with open('./file.yaml', 'r', encoding='utf-8') as f:
data = yaml.load(stream=f, Loader=yaml.FullLoader)
print(data)

 運行結果如下:

 對於初學python的同學其實第一手資料最好查看模塊對於自家方法以及屬性的說明,怎麼查看help呢,以上面的load方法為例,help('yaml.load')會顯示出該方法的說明文檔

[email protected]:~# python3
Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>>
>>> help('yaml.load')

 其說明文檔如下:

 2,寫入yaml文件

with open('./data_yaml.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data=data, stream=f, allow_unicode=True, sort_keys=False, indent=4)

其寫入的文件如下:

3,dump_all的使用

        如果要將多個Python對象序列化到一個YAML流中,可以使用 yaml.dump_all 函數。該函數接受一個Python的列表或者生成器對象作為第一個參數,表示要序列化的多個Python對象

>>> obj = [{'name': 'bob', 'age': 19}, {'name': 20, 'age': 23}, {'name': 'leo', 'age': 25}]
>>> print(yaml.dump_all(obj))
{age: 19, name: bob}
--- {age: 23, name: 20}
--- {age: 25, name: leo}

   yaml.dump 和 yaml.dump_all 方法還支持多個關鍵字參數,用來指定生成的YAML流中YAML文檔的樣式和是否包含其他信息。下面就來詳細介紹下每個參數的含義和用法

stream

指定由於輸出YAML流的打開的文件對象。默認值為 None,表示作為函數的返回值返回。

default_flow_style

是否默認以流樣式顯示序列和映射。默認值為 None,表示對於不包含嵌套集合的YAML流使用流樣式。設置為 True 時,序列和映射使用塊樣式。

default_style

默認值為 None。表示標量不使用引號包裹。設置為 '"' 時,表示所有標量均以雙引號包裹。設置為 "'" 時,表示所有標量以單引號包裹。

canonical

是否以規范形式顯示YAML文檔。默認值為 None,表示以其他關鍵字參數設置的值進行格式化,而不使用規范形式。設置為 True 時,將以規范形式顯示YAML文檔中的內容。

indent

表示縮進級別。默認值為 None, 表示使用默認的縮進級別(兩個空格),可以設置為其他整數。

width

表示每行的最大寬度。默認值為 None,表示使用默認的寬度80。

allow_unicode

是否允許YAML流中出現unicode字符。默認值為 False,會對unicode字符進行轉義。設置為 True 時,YAML文檔中將正常顯示unicode字符,不會進行轉義。

line_break

設置換行符。默認值為 None,表示換行符為 '',即空。可以設置為 \n、\r 或 \r\n。

encoding

使用指定的編碼對YAML流進行編碼,輸出為字節字符串。默認值為 None,表示不進行編碼,輸出為一般字符串。

explicit_start

每個YAML文檔是否包含顯式的指令結束標記。默認值為 None,表示流中只有一個YAML文檔時不包含顯式的指令結束標記。設置為 True 時,YAML流中的所有YAML文檔都包含一個顯式的指令結束標記。

explicit_end

每個YAML文檔是否包含顯式的文檔結束標記。默認值為 None,表示流中的YAML文檔不包含顯式的文檔結束標記。設置為 True 時,YAML流中的所有YAML文檔都包含一個顯式的文檔結束標記。

version

用於在YAML文檔中指定YAML的版本號,默認值為 None,表示不在YAML中當中指定版本號。可以設置為一個包含兩個元素的元組或者列表,但是第一個元素必須為1,否則會引發異常。當前可用的YAML的版本號為1.0、1.1 和1.2。

tags

用於指定YAML文檔中要包含的標簽。默認值為 None,表示不指定標簽指令。可以設置為一個包含標簽的字典,字典中的鍵值對對應各個不同的標簽名和值。

4,其他方法和屬性

pyyaml支持很多的對yaml文件以及yaml格式數據的操作

>>> dir(yaml)
['AliasEvent', 'AliasToken', 'AnchorToken', 'BaseDumper', 'BaseLoader', 'BlockEndToken', 'BlockEntryToken', 'BlockMappingStartToken', 'BlockSequenceStartToken', 
'CollectionEndEvent', 'CollectionNode', 'CollectionStartEvent', 'DirectiveToken', 'DocumentEndEvent', 'DocumentEndToken', 'DocumentStartEvent', 'DocumentStartToken',
 'Dumper', 'Event', 'FlowEntryToken', 'FlowMappingEndToken', 'FlowMappingStartToken', 'FlowSequenceEndToken', 'FlowSequenceStartToken', 'FullLoader', 'KeyToken', 
 'Loader', 'MappingEndEvent', 'MappingNode', 'MappingStartEvent', 'Mark', 'MarkedYAMLError', 'Node', 'NodeEvent', 'SafeDumper', 'SafeLoader', 'ScalarEvent', 
 'ScalarNode', 'ScalarToken', 'SequenceEndEvent', 'SequenceNode', 'SequenceStartEvent', 'StreamEndEvent', 'StreamEndToken', 'StreamStartEvent', 
 'StreamStartToken', 'TagToken', 'Token', 'UnsafeLoader', 'ValueToken', 'YAMLError', 'YAMLLoadWarning', 'YAMLObject', 'YAMLObjectMetaclass', 
 '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '__with_libyaml__',
 '_warnings_enabled', 'add_constructor', 'add_implicit_resolver', 'add_multi_constructor', 'add_multi_representer', 'add_path_resolver', 'add_representer',
 'compose', 'compose_all', 'composer', 'constructor', 'dump', 'dump_all', 'dumper', 'emit', 'emitter', 'error', 'events', 'full_load', 'full_load_all', 'io', 
 'load', 'load_all', 'load_warning', 'loader', 'nodes', 'parse', 'parser', 'reader', 'representer', 'resolver', 'safe_dump', 'safe_dump_all', 'safe_load', 
 'safe_load_all', 'scan', 'scanner', 'serialize', 'serialize_all', 'serializer', 'tokens', 'unsafe_load', 'unsafe_load_all', 'warnings']
 
 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved