YAML簡介和PyYAML安全操作

2021-10-13 14:42:11 字數 2797 閱讀 8494

yaml 是 「yaml ain』t a markup language」(yaml 不是一種標記語言)的遞迴縮寫,是一種人類易讀的資料序列化語言。它通常運用在一些資料**分離場合:用於配置檔案,但也用於資料儲存(例如除錯輸出)或傳輸(例如文件標題)。yaml 的配置檔案字尾為 .yml,如:runoob.yml 。

陣列一組按次序排列的值,又稱為序列(sequence) / 列表(list)

純量單個的、不可再分的值

可讀性好;和指令碼語言的互動性好;有乙個一致的資訊模型;易於實現;可以基於流來處理;表達能力強,擴充套件性好。

1、大小寫敏感;

2、使用縮排表示層級關係,縮排只可以使用空格,不允許使用tab,遵守左對齊即可;

3、列表中項通過「-」表示,字典中的通過「:」表示;

4、# 表示注釋,和python表示注釋一樣。

number

:12.30

number2

:6.8523015e+5

#科學計數法表示

number3

: 0b1010_0111_0100_1010_1110 #二進位制表示

isset

:true

parent

:~

time

:2019-11-01t21:59:43.10-05:00

int_to_str

:!!str

123bool_to_str

:!!str

true

乙個比較完整的例子:

# 這是注釋

name

: joe

age:

18languages

:- python

websites

:yaml

: yaml.org

python

: python.org

pip install pyyaml
pyyaml載入yaml檔案有8種方法:load()load_all()safe_load()safe_load_all()unsafe_load()unsafe_load_all()full_load()full_load_all()。建議使用安全的safe_load()函式載入yaml檔案。

# coding:utf-8

import yaml

with

open

('test.yaml'

,'r'

,encoding=

'utf-8'

)as f:

y = yaml.safe_load(f.read())

print

(y)

結果

>>>, 'skill': [, ]}
pyyaml開發者明確知悉load()存在安全問題,但因為向前相容的問題沒有將load()改為預設以安全方式載入。建議在呼叫load()時必須以loader=指定載入方式來緩解,因此沒有該引數情況下呼叫load()會產生警告。

在pyyaml 5.1+之前,load()可以輕鬆利用該函式來呼叫任何python函式。這意味著它可以使用呼叫任何系統命令os.system()。這是乙個簡單的示例:

python -c 'import yaml; yaml.load("!!python/object/new:os.system [echo exploit!]")'
pyyaml-5.3.1以後,仍然存在一些瑣碎的漏洞利用,不要在不受信任的資料上使用load,特別是fullloader載入。

同時,pyyaml作者有意和pickle序列化相容,會導致不可信資料被不安全地載入。

load時按需指定引數loader即可:

yaml.load(

input

, loader=yaml.fullloader)

載入器

描述baseloader

僅載入最基本的yaml。所有標量都作為字串載入。

safeloader

安全地載入yaml語言的子集。建議用於載入不可信的輸入。

fullloader

載入完整的yaml語言。避免了一些執行**。

unsafeloader

不受信任的輸入可能執行其他**。

後續fullloader可能會棄用。

yaml.warnings(

)

pyyaml寫出有四個函式:dump()dump_all()safe_dump()safe_dump_all(),下面以safe_dump()為例:

import yaml

config =

with

open

('test.yaml'

,'w'

, encoding=

'utf8'

)as f:

yaml.safe_dump(config, f)

python基礎 PyYaml操作yaml檔案

格式 它的基本語法規則如下 大小寫敏感 使用縮排表示層級關係 縮排時不允許使用tab鍵,只允許使用空格。縮排的空格數目不重要,只要相同層級的元素左側對齊即可 yaml 支援的資料結構有三種物件的一組鍵值對,使用冒號結構表示。animal pets 或者如下格式 hash 陣列 cat dog gol...

python基礎 PyYaml操作yaml檔案

格式 它的基本語法規則如下 大小寫敏感 使用縮排表示層級關係 縮排時不允許使用tab鍵,只允許使用空格。縮排的空格數目不重要,只要相同層級的元素左側對齊即可 物件的一組鍵值對,使用冒號結構表示。animal pets 或者如下格式 hash 陣列 cat dog goldfish 或者如下格式 an...

YAML檔案簡介

使用空格 space 縮排表示分層,不同層次之間的縮排可以使用不同的空格數目,但是同層元素一定左對齊,即前面空格數目相同 不能使用 tab,各個系統 tab對應的 space 數目可能不同,導致層次混亂 表示注釋,只能單行注釋,從 開始處到行尾 破折號後面跟乙個空格 a dash and space...