Các cặp giá trị khóa phân tích cú pháp Python

Từ điển Python là tập hợp các cặp khóa-giá trị không được sắp xếp. Trong bài viết này, chúng ta sẽ xem xét cách mở rộng một từ điển đã được tạo trước đó bằng các cặp khóa-giá trị mới

Từ điển trong Python

Một danh sách các mục nhập có thể được biến thành một từ điển trong Python bằng cách đặt chúng trong dấu ngoặc nhọn và phân tách chúng bằng dấu phẩy. Các cặp giá trị trong từ điển được giữ theo cặp, trong đó một phần tử là khóa và phần tử kia là giá trị. Các giá trị trong từ điển có thể thuộc bất kỳ loại dữ liệu nào và có thể được sao chép, không giống như các khóa, không thể lặp lại và phải không thay đổi

Cấu trúc được đặt trong dấu ngoặc nhọn {}, với dấu phẩy ngăn cách các phần tử và dấu hai chấm [. ] tách từng khóa khỏi giá trị của nó. Bạn có thể viết một cuốn từ điển không có từ nào như sau. {}

Các khóa phải là bất biến, chẳng hạn như số nguyên, bộ dữ liệu hoặc chuỗi. Tên khóa giống nhau được đánh vần khác nhau được coi là một khóa riêng biệt trong từ điển Python. Xin lưu ý rằng các khóa từ điển phân biệt chữ hoa chữ thường, nghĩa là chúng sẽ được xử lý khác nhau ngay cả khi chúng có cùng tên nhưng khác chữ hoa chữ thường

Chúng tôi có thể cần thêm hoặc cập nhật các cặp khóa/giá trị khi sử dụng từ điển. Hãy kiểm tra quy trình thêm cặp khóa-giá trị trong từ điển Python

Phương pháp - 1. Đưa ra một khóa mới ký hiệu chỉ số dưới

Sử dụng một khóa mới làm chỉ số dưới và đặt giá trị cho nó, chúng tôi thêm một mục mới vào từ điển

Thí dụ

đầu ra

The Current Dictionary is :  {'key-1': 'Technology', 'key-2': 'is'}
The Updated Dictionary is :  {'key-1': 'Technology', 'key-2': 'is', 'key-3': 'very', 'key-4': 'important', 'key-5': 'for', 'key-6': 'everyone'}

Phương pháp - 2. Việc sử dụng phương thức update[]

Một cặp khóa-giá trị được lấy bởi hàm update[] và ngay lập tức được thêm vào từ điển đã tồn tại. Tham số của hàm cập nhật là cặp khóa-giá trị. Như minh họa bên dưới, chúng tôi cũng có thể cung cấp nhiều giá trị chính

Thí dụ

đầu ra

Current Dictionary is : {'India': 'New Delhi', 'France': 'Paris', 'Nepal': 'Kathmandu', 'Spain': 'Madrid'}

Updated Dictionary is : {'India': 'New Delhi', 'France': 'Paris', 'Nepal': 'Kathmandu', 'Spain': 'Madrid', 'United States of America': 'Washington DC'}

The New Dictionary is : {'India': 'New Delhi', 'France': 'Paris', 'Nepal': 'Kathmandu', 'Spain': 'Madrid', 'United States of America': 'Washington DC', 'Australia': 'Canberra', 'Japan': 'Tokyo'}

Phương pháp - 3. Kết hợp hai từ điển

Bằng cách kết hợp hai từ điển, chúng ta cũng có thể thêm các phần tử vào một từ điển hiện có. Ở đây cũng vậy, phương thức update[] được sử dụng, nhưng lần này tham số của phương thức là một từ điển

Thí dụ

đầu ra

The Combined Dictionary is : {'India': 'New Delhi', 'France': 'Paris', 'Nepal': 'Kathmandu', 'Spain': 'Madrid', 'United States of America': 'Washington DC', 'Australia': 'Canberra', 'Japan': 'Tokyo'}

Phương pháp - 4. Sử dụng phím. Cặp giá trị làm đầu vào

Chìa khóa. cặp giá trị được lấy ở dạng đầu vào từ người dùng, sau đó được chèn và thêm vào từ điển hiện có

Ứng dụng syslog-ng OSE có thể tách một thông báo bao gồm các cặp khóa=giá trị khoảng trắng hoặc được phân tách bằng dấu phẩy [ví dụ: thông báo nhật ký Postfix] thành các cặp tên-giá trị. Bạn cũng có thể chỉ định ký tự phân cách khác thay vì dấu bằng, ví dụ: dấu hai chấm [. ] để phân tích thông điệp nhật ký MySQL. Ứng dụng syslog-ng OSE tự động cắt bỏ mọi ký tự khoảng trắng ở đầu hoặc ở cuối từ các khóa và giá trị, đồng thời phân tích cú pháp các giá trị chứa khoảng trắng không được trích dẫn. Để biết chi tiết về cách sử dụng các cặp giá trị trong syslog-ng OSE, hãy xem

Bạn có thể tham khảo các phần riêng biệt của thông báo bằng cách sử dụng khóa của giá trị dưới dạng macro. Ví dụ: nếu thông báo chứa KEY1=value1,KEY2=value2, thì bạn có thể tham chiếu các giá trị là ${KEY1} và ${KEY2}

GHI CHÚ

Nếu một thông báo nhật ký chứa cùng một khóa nhiều lần [ví dụ: key1=value1, key2=value2, key1=value3, key3=value4, key1=value5], thì syslog-ng OSE chỉ lưu trữ giá trị cuối cùng [ngoài cùng bên phải] cho . Sử dụng ví dụ trước, syslog-ng OSE sẽ lưu trữ các cặp sau. key1=value5, key2=value2, key3=value4

thận trọng

Nếu tên của các khóa trong thông báo giống với tên của macro mềm syslog-ng OSE, thì giá trị từ thông báo được phân tích cú pháp sẽ ghi đè lên giá trị của macro. Ví dụ: nội dung PROGRAM=value1, MESSAGE=value2 sẽ ghi đè lên các macro ${PROGRAM} và ${MESSAGE}. Để tránh ghi đè lên các macro như vậy, hãy sử dụng tùy chọn tiền tố[]

Macro cứng không thể được sửa đổi, vì vậy chúng sẽ không bị ghi đè. Để biết chi tiết về các loại macro, hãy xem

Trình phân tích cú pháp loại bỏ các phần thông báo không phải là cặp khóa=giá trị, ngay cả khi chúng xuất hiện giữa các cặp khóa=giá trị có thể được phân tích cú pháp

Tên của các phím chỉ có thể chứa các ký tự sau. số [0-9], chữ cái [a-z,A-Z], dấu gạch dưới [_], dấu chấm [. ], dấu gạch nối [-]. Các ký tự đặc biệt khác không được phép

Để phân tích các cặp khóa=giá trị, hãy xác định trình phân tích cú pháp có tùy chọn kv-parser[]. Xác định tiền tố là tùy chọn. Theo mặc định, trình phân tích cú pháp sẽ xử lý phần ${MESSAGE} của thông báo tường trình. Bạn cũng có thể xác định nội tuyến trình phân tích cú pháp trong đường dẫn nhật ký

Tuyên ngôn.
parser parser_name {
    kv-parser[
        prefix[]
    ];
};

Thí dụ. Sử dụng trình phân tích cú pháp key=value

Trong ví dụ sau, nguồn là một thông báo tường trình bao gồm các cặp khóa=giá trị được phân tách bằng dấu phẩy, ví dụ: thông báo tường trình Postfix

Jun 20 12:05:12 mail.example.com  postfix/qmgr[35789]: EC2AC1947DA: from=, size=807, nrcpt=1 [queue active]

Trình phân tích cú pháp kv chèn ". kv. " tiền tố trước tất cả các cặp tên-giá trị được trích xuất. Đích đến là một tệp, sử dụng hàm mẫu format-json. Mọi cặp tên-giá trị bắt đầu bằng dấu chấm [". "] ký tự sẽ được ghi vào tệp [dot-nv-pairs]. Dòng nhật ký kết nối nguồn, đích và trình phân tích cú pháp

source s_kv {
    network[port[21514]];
};

destination d_json {
    file["/tmp/test.json"
        template["$[format-json --scope dot-nv-pairs]\n"]];
};

parser p_kv {
    kv-parser [prefix[".kv."]];
};

log {
    source[s_kv];
    parser[p_kv];
    destination[d_json];
};

Bạn cũng có thể xác định nội tuyến trình phân tích cú pháp trong đường dẫn nhật ký

source s_kv {
    network[port[21514]];
};

destination d_json {
    file["/tmp/test.json"
        template["$[format-json --scope dot-nv-pairs]\n"]];
};

log {
    source[s_kv];
    parser {
        kv-parser [prefix[".kv."]];
    };
    destination[d_json];
};

Bạn có thể đặt ký tự phân cách giữa khóa và giá trị để phân tích ví dụ về khóa. các cặp giá trị, như nhật ký MySQL

Mar  7 12:39:25 myhost MysqlClient[20824]: SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23, DB_SERVER:'127.0.0.1', DB:'--', QUERY:'USE test;'
parser p_mysql {
    kv-parser[value-separator[":"] prefix[".mysql."]];
};


Chủ đề này có hữu ích không?

[Chọn Xếp hạng]

Các tùy chọn của trình phân tích cú pháp khóa=giá trị

Trình phân tích cú pháp kv có các tùy chọn sau

extract-stray-words-into[] Tóm tắt. giải nén-lạc-từ-vào[""]

Sự miêu tả. Chỉ định cặp tên-giá trị trong đó syslog-ng OSE lưu trữ bất kỳ từ lạc đề nào xuất hiện trước hoặc giữa các cặp khóa-giá trị được phân tích cú pháp [chủ yếu khi tùy chọn này cũng được đặt]. Nếu nhiều từ lạc đề xuất hiện trong một tin nhắn, thì syslog-ng OSE sẽ lưu chúng dưới dạng danh sách được phân tách bằng dấu phẩy. Lưu ý rằng tùy chọn tiền tố [] không ảnh hưởng đến cặp tên-giá trị lưu trữ các từ đi lạc. Giá trị mặc định. không áp dụng

Thí dụ. Trích xuất các từ đi lạc trong các cặp khóa-giá trị

Ví dụ: xem xét thông báo sau

VSYS=public; Slot=5/1; protocol=17; source-ip=10.116.214.221; source-port=50989; destination-ip=172.16.236.16; destination-port=162;time=2016/02/18 16:00:07; interzone-emtn_s1_vpn-enodeb_om; inbound; policy=370;

Đây là danh sách các cặp khóa-giá trị, trong đó dấu tách giá trị là = và dấu tách cặp là ;. Tuy nhiên, trước cặp khóa-giá trị cuối cùng [chính sách=370], có hai từ bị lạc. interzone-emtn_s1_vpn-enodeb_om trong nước. Nếu bạn muốn lưu trữ hoặc xử lý những thứ này, hãy chỉ định một cặp tên-giá trị để lưu trữ chúng trong tùy chọn extract-stray-words-into[], ví dụ: extract-stray-words-into["my-stray-words"]. Giá trị của ${my-stray-words} cho tin nhắn này sẽ là interzone-emtn_s1_vpn-enodeb_om, trong nước

tiếp đầu ngữ[]

Sự miêu tả. Chèn một tiền tố trước phần tên của các cặp giá trị tên được phân tích cú pháp để giúp xử lý thêm. Ví dụ

  • Để chèn dữ liệu được phân tích cú pháp của tôi. tiền tố, hãy sử dụng tiền tố[my-parsed-data. ] quyền mua

  • Để chỉ một dữ liệu cụ thể có tiền tố, hãy sử dụng tiền tố trong tên của macro, ví dụ: ${my-parsed-data. Tên}

  • Nếu bạn chuyển tiếp các thư đã phân tích cú pháp bằng giao thức IETF-syslog, bạn có thể chèn tất cả dữ liệu đã phân tích cú pháp vào phần SDATA của thư bằng cách sử dụng tiền tố[. SDATA. dữ liệu được phân tích cú pháp của tôi. ] quyền mua

Tên bắt đầu bằng dấu chấm [ví dụ:. ví dụ] được dành riêng để sử dụng bởi syslog-ng OSE. Nếu bạn sử dụng tên macro như vậy làm tên của một giá trị được phân tích cú pháp, nó sẽ cố gắng thay thế giá trị ban đầu của macro [lưu ý rằng chỉ có thể ghi đè macro mềm, xem để biết chi tiết]. Để tránh các sự cố như vậy, hãy sử dụng tiền tố khi đặt tên cho các giá trị được phân tích cú pháp, ví dụ: prefix[my-parsed-data. ]

Ví dụ: để chèn tiền tố postfix khi phân tích thông điệp tường trình Postfix, hãy sử dụng tiền tố [. hậu tố. ] quyền mua

tách cặp [] Tóm tắt. dấu tách cặp[""]

Sự miêu tả. Chỉ định ký tự hoặc chuỗi phân tách các cặp khóa-giá trị với nhau. Giá trị mặc định. , [dấu phẩy theo sau là khoảng trắng]

Ví dụ: để phân tích các cặp key1=value1;key2=value2, hãy sử dụng kv-parser[pair-separator[;"]];

mẫu [] Tóm tắt. mẫu["${}"]

Sự miêu tả. Macro chứa một phần của thông báo mà trình phân tích cú pháp sẽ xử lý. Nó cũng có thể là macro được tạo bởi trình phân tích cú pháp trước đó của đường dẫn nhật ký. Theo mặc định, trình phân tích cú pháp xử lý toàn bộ thư [${MESSAGE}]

Cách chuyển đổi khóa

Phương pháp #1. Sử dụng map[] + split[] + vòng lặp . Trong phần này, chúng tôi thực hiện chuyển đổi các cặp khóa-giá trị sang từ điển bằng cách sử dụng bản đồ và việc tách các cặp khóa-giá trị được thực hiện bằng cách sử dụng split[].

Cái nào đại diện cho khóa

Cấu trúc bảng băm khóa/giá trị hiệu quả của Python được gọi là "dict". Nội dung của một dict có thể được viết dưới dạng một chuỗi key. cặp giá trị trong dấu ngoặc nhọn { }, e. g. dict = {key1. giá trị1, khóa2. giá trị2,. } . "Chính tả trống" chỉ là một cặp dấu ngoặc nhọn trống {}.

Cách lưu trữ dữ liệu trong khóa

Từ điển trong Python là một tập hợp các giá trị dữ liệu không có thứ tự, được sử dụng để lưu trữ các giá trị dữ liệu giống như bản đồ, không giống như các Loại dữ liệu khác chỉ chứa một giá trị dưới dạng phần tử, Từ điển chứa . cặp giá trị . Trong khi sử dụng Từ điển, đôi khi chúng ta cần thêm hoặc sửa khóa/giá trị bên trong từ điển.

Danh sách Python có thể có khóa không

Không có "cặp khóa-giá trị" chung chung trong Python . Tại sao bạn sử dụng danh sách thay vì từ điển? .

Chủ Đề