Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

LAB : Chuyển đổi các định dạng dữ liệu API sử dụng Python

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • LAB : Chuyển đổi các định dạng dữ liệu API sử dụng Python



    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]
    Mở file user.yaml và xem qua cấu trúc của file
    Đổ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]
    Sử dụng function safe_load từ thư viện ruamel.yaml để tải luồng. Lưu đối tượng vào biến user_yaml
    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]
    Xác định kiểu của đối tượng trong biến user_yaml, sử dụng type function. In kết quả
    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]
    Cho chạy code và kiểm tra kiểu của đối tượng



    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]
    Chạy code.



    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]
    Truyền giá trị từ user_yaml sang đối tượng user
    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]
    Chạy code. Đối tượng user được in bằng định dạng là dictionary


    ​​​​​​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]
    Function dumps có thể có nhiều argument. Hai argument cần thiết để tạo cấu trúc JSON từ đối tượng user là argument cho đối tượng user và argument default để nối tiếp dữ liệu đã thông qua. Tuy nhiên để tạo cấu trúc JSON, phương thức chỉ có thể lấy được một vài kiểu đối tượng nhất định. Vì đối tượng user không phải argument hợp lệ cho function dumps nên cần phải chuyển đối tượng user và function serializeUser từ module helper sang cấu trúc JSON. Cuối cùng là lưu cấu trúc này vào biến user_json
    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]
    In biến user_json ra màn hình
    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]
    Chạy code để xem cấu trúc JSON


    Đầ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]
    So sánh bộ chuyển đổi XML khác nhau

    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
    Parse file user.xml và đặt vào biến tree
    Code:
    [FONT=Calibri][FONT=Times New Roman]# Parse the user.xml file[/FONT][/FONT]
    [FONT=Times New Roman]tree = ET.parse('user.xml')[/FONT]
    Lấy thành phần root
    Code:
    [FONT=Calibri][FONT=Times New Roman]# Get the root element[/FONT][/FONT]
    [FONT=Times New Roman]root = tree.getroot()[/FONT]
    In ra màn hình những nhãn( sử dụng vòng lặp for)
    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]
    Tìm tất cả các thành phần với nhãn address trong root
    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]
    In các address trong file xml
    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
    Parse file XML và đặt vào biến dom
    Code:
    [FONT=Calibri][FONT=Times New Roman]# Parse the user.xml file[/FONT][/FONT]
    dom = MD.parse('user.xml')
    In ra các nhãn trong file 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]
    Lấy thành phần root
    Code:
    [FONT=Calibri][FONT=Times New Roman]# Get the root element[/FONT][/FONT]
    [FONT=Times New Roman]root = itemTree.getroot()[/FONT]
    Định nghĩa namespaces
    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]
    Đặt từ khóa table trong namespaces và đặt vào biến elementsInNSa,b
    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]
    In các thành phần trong namespace a
    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
    Last edited by huynhvanmanhtien; 16-03-2020, 09:24 AM.
Working...
X