溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python第三方庫yaml的安裝與應(yīng)用

發(fā)布時間:2021-06-18 13:42:21 來源:億速云 閱讀:532 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Python第三方庫yaml的安裝與應(yīng)用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python第三方庫yaml的安裝與應(yīng)用”吧!

目錄
  • 一、yaml基本介紹

  • 二、適用場景

  • 三、基本的語法規(guī)則

  • 四、YAML支持的三種數(shù)據(jù)結(jié)構(gòu)

    • 4.1 對象

    • 4.2 數(shù)組

      • 4.2.1 對象和數(shù)組

    • 4.3 純量

      • 4.4 還有一些特殊符號

        • 4.4.1 — YAML可在同一個文件中,使用—表示一個文檔的開始

        • 4.4.2 …和—配合使用,在一個配置文件中代表一個的結(jié)束

        • 4.4.3 YAML中使用!!做類型強(qiáng)行轉(zhuǎn)換

        • 4.4.4 > 在字符串中表示折疊換行;| 保留換行。這兩個符號是YAML中字符串經(jīng)常使用的符號

        • 4.4.5 引用。重復(fù)的內(nèi)容在YAML中可使用&來完成錨點(diǎn)定義,用*來完成錨點(diǎn)引用

        • 4.4.6 合并內(nèi)容。主要是和錨點(diǎn)配合使用,可將一個錨點(diǎn)內(nèi)容直接合并到一個對象中

    • 五、實(shí)戰(zhàn)

      • 5.1 安裝yaml

        • 5.2 Python使用yaml

        一、yaml基本介紹

        yaml是Python的第三方庫。YAML is a human friendly data serialization standard for all programming languages(YAML是一個對所有編程語言都很友好的數(shù)據(jù)序列化標(biāo)準(zhǔn))。
        但為了強(qiáng)調(diào)該語言以數(shù)據(jù)為中心,而不是以標(biāo)記語言為重點(diǎn),而用返璞詞重新命名。它是一種直觀的能夠被電腦識別的數(shù)據(jù)序列化格式,是一種可讀性高且容易被人類閱讀、容易和腳本語言(不僅僅是Python)交互,用于表達(dá)資料序列的編程語言。YAML語言的本質(zhì)是 一種通用的數(shù)據(jù)串行化格式。

        二、適用場景

        • 在腳步語言中使用,實(shí)現(xiàn)簡單,解析成本低;

        • 序列化;

        • 編程時寫配置文件,比xml快,比ini文檔功能更強(qiáng)。

        • YAML是專門用于寫配置文件的語言,非常簡潔和強(qiáng)大,遠(yuǎn)比JSON格式方便。

        三、基本的語法規(guī)則

        • 大小寫敏感;

        • 使用縮進(jìn)表示層級關(guān)系;

        • 縮進(jìn)時不允許使用Tab鍵,只允許使用空格;

        • 縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可(一般2個或4個空格);

        • #表示注釋當(dāng)前行。

        四、YAML支持的三種數(shù)據(jù)結(jié)構(gòu)

        • 對象:即鍵值對的集合,又稱為映射(mapping)/哈希(hashes)/字典(dictionary);

        • 數(shù)組:一組按次序排列的值,又稱為序列(sequence)/列表(list);

        • 純量:單個的、不可再分的值。

        4.1 對象

        使用冒號代表,格式為 key: value。冒號后須加一個空格。
        使用縮進(jìn)表示層級關(guān)系,如下:

        key:
          child_key1: value1
          child-key2: value2

        YAML還支持流式(flow)語法表示對象,上例可寫成:

        key: {child_key1: value1, child_key2: value2}

        這在Python中是 字典嵌套字典,是這么寫的:

        "key": {
                "child_key1":"value1",
                "child_key2":"value2"
               }

        較為復(fù)雜的對象格式,可使用 一個問號 加一個空格代表一個復(fù)雜的key,配合一個冒號加一個空格 代表一個value:

        ? 
          - complex_key1
          - complex_key2
        : 
          - complex_value1
          - complex_value2

        上述表示:對象的屬性是一個數(shù)組[complex_key1, complex_key2],其對應(yīng)的值也是一個數(shù)組[complex_value1, complex_value2]。

        4.2 數(shù)組

        使用一個短橫線 加一個空格代表一個數(shù)組項(xiàng):

        hobby:
          - python
          - test

        也可以這樣說:

        -
          - python
          - test

        可簡單理解為:[[python, test]]
        再看一個相對復(fù)雜的例子:

        role:
        - 
          id: 1
          name: developer
          auth: dev
        - 
          id: 2
          name: tester
          auth: test

        可理解為:role屬性是一個數(shù)組,每個數(shù)組元素又是由id、name、auth 3個屬性構(gòu)成。
        用流式(flow)的方式表示如下:

        role: [{id: 1, name: developer, auth: dev}, {id: 2, name: tester, auth: test}]
        4.2.1 對象和數(shù)組

        可結(jié)合使用,形成復(fù)合結(jié)構(gòu)

        languages:
         - Ruby
         - Perl
         - Python 
        websites:
         YAML: yaml.org 
         Ruby: ruby-lang.org 
         Python: python.org 
         Perl: use.perl.org

        4.3 純量

        純量是最基本的、不可再分的值。YAML提供了多種常量結(jié)構(gòu):整數(shù)、浮點(diǎn)數(shù)、字符串、NULL、日期、布爾值、時間。

        int: 
        - 123
        - 0b1010_0111_0100_1010_1110 # 二進(jìn)制表示
        float:
        - 3.14159
        - 6.6e+5 # 可使用科學(xué)計(jì)數(shù)法
        string:
        - 'Hello world!' # 可使用雙引號或單引號包裹特殊字符,雙引號不會對特殊字符轉(zhuǎn)義。
        - newline
          newline2 # 字符串可拆成多行,每一行會被轉(zhuǎn)化成一個空格
        null: 
         nodeName: 'node'
         parent: ~ # 使用 ~ 表示null
        boolean: 
         - TRUE # true 或True都可以
         - FALSE # false 或False都可以
        date:
        - 2018-12-29 # 日期必須使用ISO 8601格式,即yyyy-MM-dd
        datetime: 
        - 2018-12-29T18:43:21+08:00 #時間使用ISO 8601格式,時間和日期之間使用T連接,最后使用+代表時區(qū)

        4.4 還有一些特殊符號

        4.4.1 — YAML可在同一個文件中,使用—表示一個文檔的開始
        server: 
          address: 192.168.1.100
        ---
        spring: 
          profiles: development
          server: 
            address: 127.0.0.1
        ---
        spring:
          profiles: production
          server: 
            address: 192.168.1.120

        上述例子定義兩個profile,一個development、一個production。

        也可以用 —來分割不同的內(nèi)容,比如記錄日志:

        ---
        Time: 2018-12-29T19:09:30+08:00
        User: ed
        Warning:
          This is an error message for the log file.
        ---
        Time: 2018-12-29T19:11:45+08:00
        User: ed
        Warning:
          A slightly different error message.
        4.4.2 …和—配合使用,在一個配置文件中代表一個的結(jié)束
        ---
        time: 19:13:09
        player: Tim
        action: strike
        ...
        ---
        time: 20:14:45
        player: Lily
        action: grand
        ...

        此例相當(dāng)于在一個yaml文件中連續(xù)寫了兩個yaml配置項(xiàng)。

        4.4.3 YAML中使用!!做類型強(qiáng)行轉(zhuǎn)換
        string:
          - !!str 123456
          - !!str true

        相當(dāng)于將數(shù)字和布爾類型強(qiáng)轉(zhuǎn)為字符串(允許轉(zhuǎn)換的類型還有很多)。

        4.4.4 > 在字符串中表示折疊換行;| 保留換行。這兩個符號是YAML中字符串經(jīng)常使用的符號
        acomplistment: >
          Mark set a major league
          home run record in 1998.
        status: |
          65 Home Runs
          0.278 Batting Average

        accomplistment的結(jié)果為:

        accomplistment=Mark set a major league home run record in 1998.

        status的結(jié)果為:

        status=65 Home Runs
         0.278 Batting Average
        4.4.5 引用。重復(fù)的內(nèi)容在YAML中可使用&來完成錨點(diǎn)定義,用*來完成錨點(diǎn)引用
        hr: 
          - Mark McGwire
          - &SS Sammy Sosa
        rbi: 
          - *SS
          - Ken Griffey

        在hr中,使用&SS為Sammy Sosa設(shè)置了一個錨點(diǎn)(引用),名稱為SS;在rbi中,使用*SS完成了錨點(diǎn)使用。結(jié)果是:

        {rbi=[Mark McGwire, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}

        也可以這樣定義:

        SS: &SS Sammy Sosa
        hr:
         - Mark McGwire
         - *SS
        rbi:
         - *SS 
         - Ken Griffey

        還可以用錨點(diǎn)定義更復(fù)雜的內(nèi)容:

        default: &default
            - Mark McGwire
            - Sammy Sosa
        hr: *default

        hr相當(dāng)于引用default數(shù)組。不過,hr: *default須寫在同一行。

        4.4.6 合并內(nèi)容。主要是和錨點(diǎn)配合使用,可將一個錨點(diǎn)內(nèi)容直接合并到一個對象中
        merge:
          - &CENTER { x: 1, y: 2 }
          - &LEFT { x: 0, y: 2 }
          - &BIG { r: 10 }
          - &SMALL { r: 1 }
          
        sample1: 
            <<: *CENTER
            r: 10
            
        sample2:
            << : [ *CENTER, *BIG ]
            other: haha
            
        sample3:
            << : [ *CENTER, *BIG ]
            r: 100

        在merge中,定義了四個錨點(diǎn),分別在sample中使用。

        sample1中,<<: *CENTER意思是引用{x: 1,y: 2},并且合并到sample1中,那么合并的結(jié)果為:sample1={r=10, y=2, x=1}

        sample2中,<<: [*CENTER, *BIG] 意思是聯(lián)合引用{x: 1,y: 2}和{r: 10},并且合并到sample2中,那么合并的結(jié)果為:sample2={other=haha, x=1, y=2, r=10}

        sample3中,引入了*CENTER, *BIG,還使用了r: 100覆蓋了引入的r: 10,所以sample3值為:sample3={r=100, y=2, x=1}

        有了合并,我們就可以在配置中,把相同的基礎(chǔ)配置抽取出來,在不同的子配置中合并引用即可。

        五、實(shí)戰(zhàn)

        5.1 安裝yaml

        yaml包名是 pyyaml,但導(dǎo)入是yaml。

        5.2 Python使用yaml

        以 【用Python 讀取yaml文件(后綴可為 .yml 或 .yaml)】為例:先用open方法讀取文件數(shù)據(jù),再通過load方法轉(zhuǎn)成字典(load方法跟json的load是相似的)。

        在同一個文件夾下,編寫yaml文件,名為 cfg.yml,內(nèi)容如下:

        nb:
          user: admin
          psw: 123456

        編寫讀取yaml文件的.py文件,名為 readyml.py,內(nèi)容如下:

        import yaml
        import os
        
        curPath = os.path.dirname(os.path.realpath(__file__)) # 獲取當(dāng)前腳本所在文件夾路徑
        ymlPath = os.path.join(curPath, "cfg.yml") # 獲取yaml文件路徑
        
        # 用open方法打開直接讀取
        f = open(ymlPath, 'r')
        cfg = f.read()
        print(type(cfg)) # 讀取的結(jié)果是 字符串
        print(cfg)
        
        d = yaml.load(cfg) # 用load方法轉(zhuǎn)字典
        print(d)
        print(type(d))
        
        a = {'name': 'Tom',
        	'race': 'cat',
        	'traits': ['Two_Hand', 'Two_Eye']
        }
        ret = yaml.dump(a)
        print(ret)
        print(type(ret))

        其中,最重要的兩個方法:

        • load(),解析yaml文檔,返回一個Python對象;

        • load_all(),如果是string或文件包含幾塊yaml文檔,可用該方法來解析全部的文檔,生成一個迭代器;

        • dump(),將一個Python對象生成為一個yaml文檔;

        • dump_all(),將多個段輸出到一個yaml文檔中。

        感謝各位的閱讀,以上就是“Python第三方庫yaml的安裝與應(yīng)用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python第三方庫yaml的安裝與應(yīng)用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

        向AI問一下細(xì)節(jié)

        免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

        AI