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 Show
Từ điển trong PythonMộ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ướiSử 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ểnBằ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àoChì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ọngNế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ụ
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óaPhươ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óaCấ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óaTừ đ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ôngKhô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? . |