Import thư viện cần thiết
Vào cmd gõ lệnh: py –m pip install ruamel.yaml
Chuyển đổi file YAML:
Trong phần này, bạn sẽ phát triển đoạn script Python để chuyển đổi file YAML bằng cách sử dụng module ruamel.yaml. Đoạn code tổng thể gồm class người dùng và các funtion đã được chuẩn bị để bạn sử dụng. Bạn sẽ học cách sử dụng module ruamel.yaml trong Python và có thể chuyển đổi các đối tượng trong YAML.
Bạn sẽ dựa vào cấu trúc dựng sẵn, đọc comment và điền vào những phần thiếu trong quá trình làm lab này.
Trong phần đầu đoạn code, import module ruamel.yaml
Code:
[FONT=Calibri][FONT=Times New Roman]# Import modules[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]import sys[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]from helper import *[/FONT][/FONT] [FONT=Times New Roman]from ruamel import yaml[/FONT]
Đổi lại file lab01.py, trong chức năng chính, sử dụng function open để mở luồng đọc file user.yaml
Code:
[FONT=Calibri][FONT=Times New Roman]# Open the user.yaml file as read only[/FONT][/FONT] [FONT=Times New Roman]with open('user.yaml','r') as stream:[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Load the stream using safe_load[/FONT][/FONT] [FONT=Times New Roman]user_yaml = yaml.safe_load(stream)[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the object type[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print("Type of user_yaml variable:")[/FONT][/FONT] [FONT=Times New Roman]print(type(user_yaml))[/FONT]
Biến user_yaml là kiểu từ điển. Lặp lại các key trong biến user_yaml và in chúng ra màn hình. Các key từ điển giống như trong file user.yaml và ta có thể dùng chúng để truy nhập value tương ứng trong biến user_yaml.
Code:
[FONT=Calibri][FONT=Times New Roman]# Iterate over the keys of the user_yaml and print them[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Keys in user_yaml:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for key in user_yaml:[/FONT][/FONT] [FONT=Times New Roman]print(key)[/FONT]
Thêm một ví dụ mới của class User và đặt tên biến là user. Đối tượng User có nhiều thuộc tính đã được định nghĩa trong class User, được đặt ở trong file helper.py. Ta sẽ truyền giá trị từ biến user_yaml vào trong đối tượng.
Code:
[FONT=Calibri][FONT=Times New Roman]# Create a new instance of class User[/FONT][/FONT] [FONT=Times New Roman]user = User()[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Assign values form the user_yaml to the object user[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user.id = user_yaml['id'][/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user.first_name = user_yaml['first_name'][/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user.last_name = user_yaml['last_name'][/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user.birth_date = user_yaml['birth_date'][/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user.address = user_yaml['address'][/FONT][/FONT] [FONT=Times New Roman]user.score = user_yaml['score'][/FONT]
Viết và quan sát file JSON
Trong phần kế tiếp, bạn sẽ tiếp tục code dựa trên kết quả phần trước. Ta sẽ chuẩn bị đối tượng tới JSON serializable và tạo cấu trúc JSON sử dụng function dumps từ json package. Bạn sẽ viết cấu trúc JSON này ra file.
Tại đầu đoạn code import thêm module json
Code:
[FONT=Calibri][FONT=Times New Roman]# Import modules[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]import sys[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]from helper import *[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]from ruamel import yaml[/FONT][/FONT] [FONT=Times New Roman]import json[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Create JSON structure from the user object[/FONT][/FONT] [FONT=Times New Roman]user_json = json.dumps(user, default = serializeUser)[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the created JSON structure[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Print user_json:')[/FONT][/FONT] [FONT=Times New Roman]print(user_json)[/FONT]
Đầu ra của cấu trúc JSON là dạng có thể đọc được và sắp xếp theo thứ tự alpha bằng cách dùng sort_keys = True. Đặt tham số indent(thụt lề) bằng 4 vào phương thức dumps.
Code:
[FONT=Calibri][FONT=Times New Roman]# Create JSON structre with indents and soreted keys[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('JSON with indents and sorted keys')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]user_json = json.dumps(user, default = serializeUser, indent = 4, sort_keys = True)[/FONT][/FONT] [FONT=Times New Roman]print(user_json)[/FONT]
Xuất ra file JSON
Code:
[FONT=Calibri][FONT=Times New Roman]# Print to file user.json[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]file = open("user.json","w")[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]file.write(user_json)[/FONT][/FONT] [FONT=Times New Roman]file.close()[/FONT]
Trong phần này, ta sẽ sử dụng hai bộ chuyển đổi XML là ElementTree và MiniDOM, để chuyển đổi file XML và nhận được kết quả giống nhau. Chúng ta sẽ học cách hoạt động của cả hai, khác biệt giữa chúng và khi đó bạn có thể quyết định sử dụng cái mình thích hơn.
Mở file user.xml và xem qua nó. File XML bao gồm các thông tin giống như file YAML ta đã xem trước đó.
Chuyển đổi file XML với ElementTree
Mở lab01.py. Trên đầu đoạn code, import thư viện và đặt tắt là ET
Code:
import xml.etree.ElementTree as ET
Code:
[FONT=Calibri][FONT=Times New Roman]# Parse the user.xml file[/FONT][/FONT] [FONT=Times New Roman]tree = ET.parse('user.xml')[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Get the root element[/FONT][/FONT] [FONT=Times New Roman]root = tree.getroot()[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the tags[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Tags in the XML:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for element in root:[/FONT][/FONT] [FONT=Times New Roman]print(element.tag)[/FONT]
In giá trị nhãn id
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the value of id tag[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('id tag value:')[/FONT][/FONT] [FONT=Times New Roman]print(root.find('id').text)[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Find all elements with the tag address in root[/FONT][/FONT] [FONT=Times New Roman]addresses = root.findall('address')[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the adresses in the xml[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Addresses:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for address in addresses:[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for i in address:[/FONT][/FONT] [FONT=Times New Roman]print(i.tag + ':' + i.text)[/FONT]
Khác với ở trên là tìm và in các address, tiếp theo ta sẽ in tất cả các thành phần trong root bao gồm các nhãn và các giá trị
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the elements in root with their tags and values[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Print the structure')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for k in root.iter():[/FONT][/FONT] [FONT=Times New Roman]print(k.tag + ':' + k.text)[/FONT]
Chuyển đổi file XML với MiniDOM
Trên phần đầu đoạn code ta sẽ import thêm thư viện và gọi tắt là MD
Code:
import xml.dom.minidom as MD
Code:
[FONT=Calibri][FONT=Times New Roman]# Parse the user.xml file[/FONT][/FONT] dom = MD.parse('user.xml')
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the tags[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Tags in the XML:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for node in dom.childNodes:[/FONT][/FONT] [FONT=Times New Roman]printTags(node.childNodes)[/FONT]
Truy cập vào giá trị id và in nó ra màn hình
Code:
[FONT=Calibri][FONT=Times New Roman]# Accessing element value[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Accessing element value')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]idElements = dom.getElementsByTagName('id')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print(idElements)[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]elementId= idElements.item(0)[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print(elementId.childNodes)[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]idValue = elementId.firstChild.data[/FONT][/FONT] [FONT=Times New Roman]print(idValue)[/FONT]
In các thành phần có nhãn ‘address’
Code:
[FONT=Calibri][FONT=Times New Roman]# Print elements from the DOM with tag name 'address'[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Addresses:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for node in dom.getElementsByTagName('address'):[/FONT][/FONT] [FONT=Times New Roman]printNodes(node.childNodes)[/FONT]
In cả cấu trúc file XML bằng printNodes
Code:
[FONT=Calibri][FONT=Times New Roman]# Print the entire structure with printNodes[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('The structure:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for node in dom.childNodes:[/FONT][/FONT] [FONT=Times New Roman]printNodes(node.childNodes)[/FONT]
Sử dụng Namespaces
Parse file item.xml vào biến itemTree
Code:
[FONT=Calibri][FONT=Times New Roman]# Parse the item.xml file[/FONT][/FONT] [FONT=Times New Roman]itemTree = ET.parse('item.xml')[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Get the root element[/FONT][/FONT] [FONT=Times New Roman]root = itemTree.getroot()[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Define namespaces[/FONT][/FONT] [FONT=Times New Roman]namespaces = {'a':'https://www.example.com/network','b':'https://www.example.com/furniture'}[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Set table as the root element[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]elementsInNSa = root.findall('a:table',namespaces)[/FONT][/FONT] [FONT=Times New Roman]elementsInNSb = root.findall('b:table',namespaces)[/FONT]
Code:
[FONT=Calibri][FONT=Times New Roman]# Elements in NS a[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Elements in NS a:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for e in elementsInNSa:[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for i in e.iter():[/FONT][/FONT] [FONT=Times New Roman]print(i.tag + ':'+ i.text)[/FONT]
In các thành phần trong namespace b
Code:
[FONT=Calibri][FONT=Times New Roman]# Elements in NS b[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]print('Elements in NS b:')[/FONT][/FONT] [FONT=Calibri][FONT=Times New Roman]for element in list(elementsInNSb[0]):[/FONT][/FONT] [FONT=Times New Roman]print(element.tag + ":" + element.text)[/FONT]
Hoàn thành bài Lab
Thank you.
Nguồn : VNPRO