yaml的英文名稱是Yet Another Markup Language,直譯過來就是標記語言。yaml用的比較多的地方就是寫配置文件,比如yaml配置文件在Kubernetes用的就非常廣泛,學Kubernetes必須要先學yaml文件格式。
先簡單的介紹一下yanm的基本語法:
pyyaml是python的第三方庫,需要自己手動安裝才能使用
pip install pyyaml
本次安裝的是pyyaml的6.0版本
先看看已經准備好的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')
其說明文檔如下:
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)
其寫入的文件如下:
如果要將多個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,表示不指定標簽指令。可以設置為一個包含標簽的字典,字典中的鍵值對對應各個不同的標簽名和值。
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']