Mỗi bản ghi tạo một hàng dữ liệu
Đây là phần vận dụng kết hợp Python đã học với HTML. Dữ liệu giả định gồm các hàng bốn giá trị: tên nhóm và điểm của ba lần. Hai hàng tiêu đề dùng một ô Nhóm có rowspan2 và một ô Điểm có colspan3.
Với mỗi bản ghi, tạo một tr; với mỗi giá trị trong bản ghi, tạo một td. Sau khi duyệt hết dữ liệu mới đóng table. Chương trình sinh văn bản nguồn, rồi trình duyệt đọc tệp đó để hiển thị; Python không tự thay vai trò trình duyệt.
Chương trình mẫu hoàn chỉnh
```python
from html import escape
data = [
["Nhóm <A>", 8, 9, 7],
["Nhóm B & C", 7.5, 8, 9],
]
content = """<!DOCTYPE html>
<html lang="vi">
<head><meta charset="utf-8"><title>Điểm minh họa</title></head>
<body><table style="border:1px solid blue">
<caption>Điểm minh họa, dữ liệu giả định</caption>
<tr>
<th style="border:1px solid blue" rowspan="2">Nhóm</th>
<th style="border:1px solid blue" colspan="3">Điểm</th>
</tr>
<tr>
<th style="border:1px solid blue">Lần 1</th>
<th style="border:1px solid blue">Lần 2</th>
<th style="border:1px solid blue">Lần 3</th>
</tr>
"""
for row in data:
if len(row) != 4:
raise ValueError("Mỗi hàng phải có bốn giá trị")
content += "<tr>"
for value in row:
text = escape(str(value))
content += '<td style="border:1px solid blue">'
content += text + "</td>"
content += "</tr>\n"
content += "</table></body></html>"
with open("diem_minh_hoa.html", "w", encoding="utf-8") as output:
output.write(content)
```
`str(value)` đổi số hoặc chuỗi thành văn bản để ghép. `escape` đổi các kí tự như `<`, `>` và `&` thành cách ghi an toàn trong HTML; nhờ đó tên “Nhóm <A>” hiện đúng như chữ, không bị hiểu thành một thẻ A.
Điều kiện độ dài yêu cầu mỗi hàng đúng bốn giá trị. Nếu hàng thiếu hoặc thừa giá trị, chương trình báo lỗi trước khi mở tệp để ghi. Không tự thêm ô thiếu hoặc bỏ dữ liệu thừa.
Chạy và đối chiếu sản phẩm
1. Lưu mã Python từ tệp kèm theo vào một thư mục thực hành riêng. Chạy bằng Python3; chỉ dùng dữ liệu giả định trong mẫu.
2. Chương trình tạo `diem_minh_hoa.html` trong thư mục làm việc hiện tại. Mã dùng chế độ w nên có thể ghi đè tệp cùng tên; kiểm thư mục trước khi chạy.
3. Mở tệp bằng trình duyệt. Mẫu có hai hàng dữ liệu, mỗi hàng bốn ô; tên có `<A>` và `&` phải hiện nguyên nghĩa. Có hai hàng tiêu đề, nên toàn bảng có bốn tr.
4. Thêm một bản ghi đủ bốn giá trị, chạy lại rồi tải lại tệp HTML. Số hàng dữ liệu tăng một; không sửa phần hai hàng tiêu đề để thêm bản ghi.
Danh sách dữ liệu rỗng vẫn tạo phần tên bảng và hai hàng tiêu đề, nhưng không có hàng điểm. Đó là trường hợp biên cần phân biệt với một bản ghi thiếu giá trị.
Bài luyện
Với hai bản ghi trong chương trình mẫu, bảng sinh ra có tổng cộng bao nhiêu tr?
Cần cộng hai tr tiêu đề có sẵn.
Đúng. Mỗi bản ghi thêm một tr dữ liệu.
caption không thêm tr.
Mỗi giá trị tạo td, khác hàng tr.
Lời giải
Phần đầu chương trình tạo hai tr tiêu đề. Vòng lặp ngoài chạy hai lần cho hai bản ghi, mỗi lần tạo thêm một tr. Tổng là 2 + 2 = 4 hàng.
Bài luyện
Vì sao chương trình dùng escape cho tên “Nhóm <A>”?
escape không thay đổi ý nghĩa số điểm.
escape xử lí văn bản, không tạo ảnh.
Đúng. Các dấu đặc biệt được biểu diễn mà không thành thẻ.
Hàm không có mục đích xóa tiếng Việt.
Lời giải
Các dấu nhỏ hơn/lớn hơn có thể được hiểu là dấu thẻ trong HTML. escape biến chúng thành cách ghi thích hợp để trình duyệt hiện nguyên tên Nhóm <A>, đồng thời xử lí dấu & trong dữ liệu chữ.
Bài luyện
Nếu một hàng chỉ có ba giá trị, chương trình mẫu làm gì?
Đúng. Điều kiện len(row)!=4 dẫn tới báo lỗi.
Không có mã tự thêm số0.
Không có mã bỏ tiêu đề.
Không có mã tự sửa cấu trúc gộp ô theo dữ liệu thiếu.
Lời giải
Trong vòng lặp, chương trình kiểm len(row) phải bằng 4. Với hàng ba giá trị, điều kiện len(row)!=4 đúng nên chương trình báo ValueError. Lệnh mở tệp để ghi đặt sau phần duyệt dữ liệu và chưa được thực hiện.
Đang học