Python thêm khóa vào yaml

Trong phần này, chúng tôi sẽ viết YAML thích hợp. Ánh xạ YAML còn được gọi là mảng kết hợp, bảng băm, khóa. cặp giá trị hoặc bộ sưu tập. Trong ánh xạ, tên của hai khóa không được giống nhau. Có bốn loại ánh xạ

  • ánh xạ đơn giản
  • ánh xạ trình tự
  • ánh xạ lồng nhau
  • ánh xạ hỗn hợp

Ánh xạ đơn giản

Trong ánh xạ đơn giản, chúng tôi sẽ cung cấp một khóa trong phần đầu tiên, sau đó phân tách bằng dấu hai chấm và dấu cách. Nó là cần thiết để sử dụng một không gian. Chúng tôi sẽ đặt từng thành viên của danh sách trên một dòng mới nếu chúng tôi muốn thêm một danh sách có khóa [từ điển] vào tài liệu của mình, trong ví dụ này, chúng tôi có một khóa máy chủ và giá trị của máy chủ là phl-42. Chúng tôi cũng có một học sinh chủ chốt, và tên học sinh đó là harry

Thí dụ

Trong một phím duy nhất. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi sẽ sử dụng dấu ngoặc kép để hiển thị giá trị của khóa. Khi chúng tôi đánh giá ví dụ YAML ở trên trong python, chúng tôi sẽ nhận được như sau

Trình tự trong ánh xạ

Chúng ta có thể ánh xạ giá trị của khóa theo trình tự. Trong ví dụ sau, chúng tôi có một sở thích chính và một danh sách theo sở thích. Nó chứa các dấu gạch ngang để cho biết rằng đó là một danh sách, không chỉ là một khóa-giá trị

Thí dụ

Trong khóa thứ tự. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi phải sử dụng dấu ngoặc vuông để hiển thị danh sách sở thích và chúng tôi cũng phải sử dụng dấu phẩy giữa tất cả các sở thích. Chúng tôi sẽ thêm tất cả những thứ này trong một dòng. Khi chúng tôi đánh giá ví dụ trên, chúng tôi sẽ nhận được như sau

Ánh xạ lồng nhau

Chúng ta có thể lồng ánh xạ vào nhau. Trong ví dụ sau, chúng tôi có một trung tâm dữ liệu chính và bên dưới trung tâm dữ liệu, chúng tôi có ba khóa. cặp giá trị. Cái đầu tiên là vị trí cho giá trị canada. Cái thứ hai là cab cho giá trị 13. Cái thứ ba là cab_unit cho giá trị 3

Thí dụ

Trong khóa lồng nhau. ánh xạ giá trị, chúng tôi sẽ thay đổi YAML ở trên thành kiểu dòng chảy. Vì vậy, chúng tôi phải sử dụng dấu ngoặc nhọn và chúng tôi cũng phải sử dụng dấu phẩy giữa các giá trị bổ sung của mình. Chúng tôi sẽ thêm tất cả những thứ này trong một dòng như sau

network:
    version: 2
    renderer: networkd
    ethernets:
        ens3:
        dhcp4: no
        addresses: [155.128.134.198/23,'2002:18f0:b009:f84:5200:03ff:fdf7:d0c2/64']
        gateway4: 155.128.134.198
        nameservers:
            addresses: [108.61.10.10]
____1
$ python3 addy.py 
{'network': {'ethernets': {'addresses': ['155.128.134.198/23',
                                         '2002:18f0:b009:f84:5200:03ff:fdf7:d0c2/64',
                                         'abc'],
                           'dhcp4': False,
                           'ens3': None,
                           'gateway4': '155.128.134.198',
                           'nameservers': {'addresses': ['108.61.10.10']}},
             'renderer': 'networkd',
             'version': 2}}
$

Thêm ví dụ mã Python

Ví dụ phổ biến

YAML Ain't Markup Language [YAML] là ngôn ngữ tuần tự hóa đã tăng dần mức độ phổ biến trong vài năm qua. Nó thường được sử dụng làm định dạng cho các tệp cấu hình, nhưng khả năng tuần tự hóa đối tượng của nó làm cho nó trở thành một sự thay thế khả thi cho các ngôn ngữ như JSON. Hướng dẫn YAML này sẽ trình bày cú pháp ngôn ngữ bằng hướng dẫn và một số ví dụ viết mã đơn giản trong Python. YAML có hỗ trợ ngôn ngữ rộng rãi và ánh xạ dễ dàng vào các cấu trúc dữ liệu gốc. Con người cũng dễ đọc, đó là lý do tại sao nó là một lựa chọn tốt cho cấu hình. Từ viết tắt YAML là viết tắt của Yet Another Markup Language. Nhưng những người bảo trì đã đổi tên nó thành YAML Ain't Markup Language để nhấn mạnh hơn vào các tính năng hướng dữ liệu của nó

Hướng dẫn YAML Bắt đầu nhanh. Một tập tin đơn giản

Chúng ta hãy xem một tệp YAML để biết tổng quan ngắn gọn

---
 doe: "a deer, a female deer"
 ray: "a drop of golden sun"
 pi: 3.14159
 xmas: true
 french-hens: 3
 calling-birds:
   - huey
   - dewey
   - louie
   - fred
 xmas-fifth-day:
   calling-birds: four
   french-hens: 3
   golden-rings: 5
   partridges:
     count: 1
     location: "a pear tree"
   turtle-doves: two

Tệp bắt đầu bằng ba dấu gạch ngang. Các dấu gạch ngang này cho biết phần đầu của một tài liệu YAML mới. YAML hỗ trợ nhiều tài liệu và các trình phân tích cú pháp tuân thủ sẽ nhận ra mỗi tập hợp dấu gạch ngang là phần đầu của một tài liệu mới. Tiếp theo, chúng ta thấy cấu trúc tạo nên hầu hết tài liệu YAML điển hình. một cặp khóa-giá trị. Doe là một khóa trỏ đến một giá trị chuỗi. một con nai, một con nai cái. YAML không chỉ hỗ trợ các giá trị chuỗi. Tệp bắt đầu với sáu cặp khóa-giá trị. Họ có bốn loại dữ liệu khác nhau. Doe và ray là dây. Pi là một số dấu chấm động. Giáng sinh là một boolean. gà mái Pháp là một số nguyên. Bạn có thể đặt các chuỗi trong dấu ngoặc đơn hoặc dấu ngoặc kép hoặc không có dấu ngoặc kép nào cả. YAML nhận dạng các chữ số không được trích dẫn dưới dạng số nguyên hoặc dấu phẩy động. Mục thứ bảy là một mảng. Gọi chim có bốn yếu tố, mỗi yếu tố được biểu thị bằng một dấu gạch ngang mở đầu. Tôi thụt vào các phần tử trong tiếng gọi chim có hai dấu cách. Thụt đầu dòng là cách YAML biểu thị lồng nhau. Số lượng khoảng trắng có thể thay đổi từ tệp này sang tệp khác, nhưng các tab không được phép. Chúng ta sẽ xem xét cách hoạt động của thụt đầu dòng bên dưới. Cuối cùng, chúng ta thấy xmas-fifth-day, có thêm năm phần tử bên trong, mỗi phần tử được thụt vào. Chúng ta có thể xem xmas-fifth-day như một từ điển chứa hai chuỗi, hai số nguyên và một từ điển khác. YAML hỗ trợ lồng các khóa-giá trị và trộn các loại. Trước khi tìm hiểu sâu hơn, hãy xem tài liệu này trông như thế nào trong JSON. Tôi sẽ ném nó vào trình chuyển đổi JSON sang YAML tiện dụng này

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}

JSON và YAML có khả năng tương tự nhau và bạn có thể chuyển đổi hầu hết các tài liệu giữa các định dạng

Phác thảo thụt đầu dòng và khoảng trắng

Khoảng trắng là một phần của định dạng YAML. Trừ khi có chỉ định khác, các dòng mới cho biết phần cuối của một trường. Bạn cấu trúc một tài liệu YAML với thụt đầu dòng. Mức thụt đầu dòng có thể là một hoặc nhiều khoảng trắng. Thông số kỹ thuật cấm các tab vì các công cụ đối xử với chúng khác nhau. Xem xét tài liệu này. Các mục bên trong công cụ được thụt vào với hai dấu cách

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo

Chúng ta hãy xem cách một tập lệnh python đơn giản xem tài liệu này. Chúng tôi sẽ lưu nó dưới dạng tệp có tên foo. khoai mỡ. Gói PyYAML sẽ ánh xạ luồng tệp YAML vào từ điển. Chúng tôi sẽ lặp qua tập hợp khóa và giá trị ngoài cùng, đồng thời in khóa và biểu diễn chuỗi của từng giá trị. Bạn có thể tìm thấy bộ xử lý cho nền tảng yêu thích của mình tại đây

import yaml

if __name__ == '__main__':

    stream = open["foo.yaml", 'r']
    dictionary = yaml.load[stream]
    for key, value in dictionary.items[]:
        print [key + " : " + str[value]]

đầu ra là

foo : bar
pleh : help
stuff : {'foo': 'bar', 'bar': 'foo'}

Khi chúng ta yêu cầu python in một từ điển dưới dạng một chuỗi, nó sẽ sử dụng cú pháp nội tuyến mà chúng ta sẽ thấy bên dưới. Chúng ta có thể thấy từ đầu ra rằng tài liệu của chúng ta là một từ điển python có hai chuỗi và một từ điển khác được lồng bên trong nó. Việc lồng ghép đơn giản của YAML cho chúng ta sức mạnh để xây dựng các đối tượng phức tạp. Nhưng đó mới chỉ là khởi đầu

Bình luận

Nhận xét bắt đầu bằng dấu thăng. Chúng có thể xuất hiện sau một giá trị tài liệu hoặc chiếm toàn bộ một dòng

________số 8

Nhận xét là dành cho con người. Bộ xử lý YAML sẽ loại bỏ chúng

Kiểu dữ liệu YAML

Các giá trị trong cặp khóa-giá trị của YAML là vô hướng. Chúng hoạt động giống như các kiểu vô hướng trong các ngôn ngữ như Perl, Javascript và Python. Nó thường đủ tốt để đặt các chuỗi trong dấu ngoặc kép, để lại các số không được trích dẫn và để trình phân tích cú pháp tìm ra nó. Nhưng đó chỉ là phần nổi của tảng băng chìm. YAML có khả năng làm được nhiều hơn thế

Cặp khóa-giá trị và từ điển

Khóa-giá trị là khối xây dựng cơ bản của YAML. Mỗi mục trong tài liệu YAML là thành viên của ít nhất một từ điển. Chìa khóa luôn là một chuỗi. Giá trị là một đại lượng để nó có thể là bất kỳ kiểu dữ liệu nào. Vì vậy, như chúng ta đã thấy, giá trị có thể là một chuỗi, một số hoặc một từ điển khác

các loại số

YAML nhận ra các loại số. Chúng tôi đã thấy dấu phẩy động và số nguyên ở trên. YAML hỗ trợ một số loại số khác. Một số nguyên có thể là thập phân, thập lục phân hoặc bát phân

---
 foo: 12345
 bar: 0x12d4
 plop: 023332

Hãy chạy tập lệnh python của chúng tôi trên tài liệu này

import yaml
import pprint

with open['old.yaml','r'] as in_yamlfile:
    cur_yaml = yaml.safe_load[in_yamlfile]

cur_yaml['network']['ethernets']['addresses'].append['abc']

pprint.pprint[cur_yaml]

with open['new.yaml','w'] as out_yamlfile:
    yaml.safe_dump[cur_yaml, out_yamlfile]

with open['new.yaml','r'] as inn_yamlfile:
    new_yaml = yaml.safe_load[inn_yamlfile]

assert[cur_yaml == new_yaml]
0

Như bạn mong đợi, Ox cho biết giá trị là hệ thập lục phân và số 0 ở đầu biểu thị giá trị bát phân. YAML hỗ trợ cả số dấu phẩy động cố định và số mũ

import yaml
import pprint

with open['old.yaml','r'] as in_yamlfile:
    cur_yaml = yaml.safe_load[in_yamlfile]

cur_yaml['network']['ethernets']['addresses'].append['abc']

pprint.pprint[cur_yaml]

with open['new.yaml','w'] as out_yamlfile:
    yaml.safe_dump[cur_yaml, out_yamlfile]

with open['new.yaml','r'] as inn_yamlfile:
    new_yaml = yaml.safe_load[inn_yamlfile]

assert[cur_yaml == new_yaml]
1

Khi chúng tôi đánh giá các mục này, chúng tôi thấy

import yaml
import pprint

with open['old.yaml','r'] as in_yamlfile:
    cur_yaml = yaml.safe_load[in_yamlfile]

cur_yaml['network']['ethernets']['addresses'].append['abc']

pprint.pprint[cur_yaml]

with open['new.yaml','w'] as out_yamlfile:
    yaml.safe_dump[cur_yaml, out_yamlfile]

with open['new.yaml','r'] as inn_yamlfile:
    new_yaml = yaml.safe_load[inn_yamlfile]

assert[cur_yaml == new_yaml]
2

Cuối cùng, chúng ta có thể đại diện cho số không [NAN] hoặc vô cực

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
0

foo là vô cùng. Thanh là vô cực âm và plop là NAN

Dây

Chuỗi YAML là Unicode. Trong hầu hết các trường hợp, bạn không cần phải chỉ định chúng trong dấu ngoặc kép

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
1

Chương trình thử nghiệm của chúng tôi xử lý điều này như

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
2

Nhưng nếu chúng ta muốn xử lý các chuỗi thoát, chúng ta cần sử dụng dấu ngoặc kép

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
3

YAML xử lý giá trị đầu tiên khi kết thúc bằng dấu xuống dòng và nguồn cấp dữ liệu. Vì giá trị thứ hai không được trích dẫn, YAML coi \n là hai ký tự

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
4

YAML sẽ không thoát khỏi các chuỗi có dấu nháy đơn, nhưng các dấu nháy đơn tránh nội dung chuỗi được hiểu là định dạng tài liệu. Giá trị chuỗi có thể kéo dài nhiều hơn một dòng. Với ký tự gấp [lớn hơn], bạn có thể chỉ định một chuỗi trong một khối

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
5

Nhưng nó được giải thích mà không có dòng mới

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
6

Ký tự khối [đường ống] có chức năng tương tự, nhưng YAML diễn giải trường chính xác như là

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
7

Vì vậy, chúng ta thấy vị trí của các dòng mới trong tài liệu

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
8

Null

Bạn nhập null với dấu ngã hoặc chuỗi ký tự null không được trích dẫn

{
  "doe": "a deer, a female deer",
  "ray": "a drop of golden sun",
  "pi": 3.14159,
  "xmas": true,
  "french-hens": 3,
  "calling-birds": [
     "huey",
     "dewey",
     "louie",
     "fred"
  ],
  "xmas-fifth-day": {
  "calling-birds": "four",
  "french-hens": 3,
  "golden-rings": 5,
  "partridges": {
    "count": 1,
    "location": "a pear tree"
  },
  "turtle-doves": "two"
  }
}
9

chương trình của chúng tôi in

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
0

Đại diện của Python cho null là Không có

Booleans

YAML cho biết các giá trị boolean với các từ khóa True, On và Yes cho true. Sai được biểu thị bằng Sai, Tắt hoặc Không

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
1

Mảng

Bạn có thể chỉ định mảng hoặc danh sách trên một dòng

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
2

Hoặc, bạn có thể đặt chúng trên nhiều dòng

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
3

Định dạng nhiều dòng hữu ích cho các danh sách chứa các đối tượng phức tạp thay vì vô hướng

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
4

Một mảng có thể chứa bất kỳ giá trị YAML hợp lệ nào. Các giá trị trong danh sách không nhất thiết phải cùng loại

từ điển

Chúng tôi đã đề cập đến các từ điển ở trên, nhưng còn nhiều từ điển khác nữa. Giống như mảng, bạn có thể đặt từ điển trong dòng. Chúng tôi đã thấy định dạng này ở trên. Đó là cách python in từ điển

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
5

Chúng tôi đã nhìn thấy chúng kéo dài các dòng trước đây

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
6

Và, tất nhiên, chúng có thể được lồng vào nhau và giữ bất kỳ giá trị nào

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
7

Tùy chọn nâng cao

công cụ sửa đổi chomp

Các giá trị nhiều dòng có thể kết thúc bằng khoảng trắng và tùy thuộc vào cách bạn muốn tài liệu được xử lý mà bạn có thể không muốn giữ lại tài liệu đó. YAML có các toán tử chomp và bảo toàn dải. Để lưu ký tự cuối cùng, hãy thêm dấu cộng vào các toán tử gấp hoặc khối

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
8

Vì vậy, nếu giá trị kết thúc bằng khoảng trắng, chẳng hạn như một dòng mới, YAML sẽ giữ nguyên giá trị đó. Để tách ký tự, sử dụng toán tử dải

foo: bar
     pleh: help
     stuff:
       foo: bar
       bar: foo
9

Nhiều tài liệu

Một tài liệu bắt đầu bằng ba dấu gạch ngang và kết thúc bằng ba dấu chấm. Một số bộ xử lý YAML yêu cầu toán tử bắt đầu tài liệu. Toán tử kết thúc thường là tùy chọn. Ví dụ: Jackson của Java sẽ không xử lý tài liệu YAML mà không bắt đầu, nhưng PyYAML của Python sẽ. Bạn sẽ thường sử dụng toán tử kết thúc tài liệu khi một tệp chứa nhiều tài liệu. Hãy sửa đổi mã python của chúng tôi

import yaml

if __name__ == '__main__':

    stream = open["foo.yaml", 'r']
    dictionary = yaml.load[stream]
    for key, value in dictionary.items[]:
        print [key + " : " + str[value]]
0

Load_all của PyYAML sẽ xử lý tất cả các tài liệu trong một luồng. Bây giờ, hãy xử lý một tài liệu phức hợp với nó

import yaml

if __name__ == '__main__':

    stream = open["foo.yaml", 'r']
    dictionary = yaml.load[stream]
    for key, value in dictionary.items[]:
        print [key + " : " + str[value]]
1

Tập lệnh tìm thấy hai tài liệu YAML

import yaml

if __name__ == '__main__':

    stream = open["foo.yaml", 'r']
    dictionary = yaml.load[stream]
    for key, value in dictionary.items[]:
        print [key + " : " + str[value]]
2

Sự kết luận

YAML là một ngôn ngữ mạnh mẽ có thể được sử dụng cho các tệp cấu hình, thông báo giữa các ứng dụng và lưu trạng thái ứng dụng. Chúng tôi đã đề cập đến các tính năng được sử dụng phổ biến nhất của nó, bao gồm cách sử dụng các kiểu dữ liệu tích hợp và cấu trúc các tài liệu phức tạp. Một số nền tảng hỗ trợ các tính năng nâng cao của YAML, bao gồm các loại dữ liệu tùy chỉnh

Chủ Đề