Học bằng cách đọc theo thứ tự

string và textwrap — Hằng số ký tự, Template và định dạng

Hằng string.ascii_letters / digits, thay thế $name với string.Template, gỡ thụt lề với textwrap.dedent, và xuống dòng theo độ rộng với fill, qua mẫu email xác nhận đơn hàng.

Vai trò của string và textwrap

stringtextwrapcác module phụ trợ bổ sung cho việc xử lý chuỗi hằng ngày. string cung cấp hằng số ký tự (tập hợp các chữ cái, chữ số và ký hiệu) và Template (thay thế template kiểu $name); textwrap đảm nhận định dạng chuỗi nhiều dòng (loại bỏ thụt lề và xuống dòng theo độ rộng). Bạn dùng đến chúng khi f-string hoặc replace chưa đủ.

Khi nào dùng string và khi nào dùng textwrap
module stringhằng số + Templatekiểm tra chữ / sốtemplate emailmodule textwrapdedent + fillloại thụt lềxuống dòng theo độ rộngcông dụngcông dụng
string mạnh ở tập hợp ký tự và thay thế template, còn textwrap dùng để làm gọn hình thức của chuỗi nhiều dòng. Cả hai đều thuộc thư viện chuẩn, và vì phạm vi sử dụng không trùng nhau nên cách dễ nhớ nhất là theo vai trò.

string — Hằng số ký tự và thay thế template

Module string có hai nhóm chức năng. Nhóm thứ nhất là hằng số ký tự như string.ascii_letters (52 chữ cái), string.digits (09), và string.punctuation (ký hiệu), giúp bạn không phải tự định nghĩa "thế nào là chữ cái / chữ số".

Nhóm thứ hai là string.Template — bạn nhúng các biến có tiền tố $ kiểu $name vào chuỗi, sau đó thay thế bằng substitute(name="giá trị"). Trông giống f-string (f"{name}"), nhưng Template có bộ phân tích đơn giản và an toàn, phù hợp khi chính bản thân template đến từ đầu vào của người dùng (ví dụ template nội dung email).

string cung cấp gì
hằng sốascii_letters / digits"toàn chữ cái?"kiểm tra / sinhTemplatetemplate kiểu $namesubstitute(name=value)thay thế
Hằng số ký tự dùng để kiểm tra hoặc sinh "chữ / số / ký hiệu". Template là một engine template nhẹ và an toàn, thay thế các placeholder kiểu $name trong chuỗi bằng giá trị thông qua substitute.
Hằng số / LớpNội dungCông dụng
string.ascii_lowercaseabcdefghijklmnopqrstuvwxyz26 chữ cái thường
string.ascii_uppercaseABCDEFGHIJKLMNOPQRSTUVWXYZ26 chữ cái hoa
string.ascii_lettersghép hai hằng trên (52 ký tự)kiểm tra chữ cái, sinh chuỗi ngẫu nhiên
string.digits0123456789kiểm tra chữ số
string.punctuation! " # $ % & ' ... v.v.kiểm tra ký hiệu
string.Template(s)lớp template kiểu $namenội dung email, template thông báo

Xây template email xác nhận đơn hàng với string.Template, rồi điền tên khách và mã đơn vào.

① Hãy import module string.

② Hãy in tổng số ký tự của hằng số chữ cái theo dạng Số chữ cái: ◯ (kết quả là 52 — hoa + thường).

③ Hãy in nội dung của hằng số chữ số theo dạng Chữ số: ◯◯.

④ Hãy tạo một đối tượng Template từ chuỗi "Hello, $name! Order #$order_id is ready.".

⑤ Hãy in kết quả thay thế với name="Minh"order_id=1234.

(Nếu chạy đúng, phần giải thích sẽ hiện ra.)

Python Editor

Chạy code để xem đầu ra

textwrap — Loại thụt lề triple-quote và xuống dòng theo độ rộng

textwrap là module thư viện chuẩn dùng để làm đẹp chuỗi. Hai hàm bạn dùng nhiều nhất là textwrap.dedent (loại bỏ thụt lề chung ở đầu mỗi dòng trong chuỗi viết bằng triple-quote) và textwrap.fill (xuống dòng một chuỗi dài theo độ rộng cho trước).

Khi bạn viết chuỗi nhiều dòng kiểu """...""" trong code, mức thụt lề ở mã nguồn bị nhúng thẳng vào chuỗi. dedent chỉ loại bỏ phần khoảng trắng đầu dòng chung, nên code vẫn được thụt lề đẹp mà chuỗi xuất ra vẫn sạch.

Cách textwrap.dedent hoạt động
chuỗi trong code Xin chào Hôm nay trời đẹptextwrap.dedentchuỗi đã làm sạchXin chàoHôm nay trời đẹp
Loại bỏ phần thụt lề chung ở đầu bị nhúng vào chuỗi triple-quote, giữ nguyên cấu trúc code mà vẫn làm sạch chuỗi. Hàm tự phát hiện số khoảng trắng đầu dòng dùng chung cho mọi dòng và loại bỏ đúng số đó.
HàmChức năngGiá trị trả về
textwrap.dedent(text)loại bỏ thụt lề chung ở đầuchuỗi đã làm sạch
textwrap.fill(text, width=N)xuống dòng theo độ rộng N thành 1 chuỗi1 chuỗi có chứa ký tự xuống dòng
textwrap.wrap(text, width=N)tách thành các dòng theo độ rộng Nlist các chuỗi
textwrap.shorten(text, w)nếu kết quả vượt độ rộng N, kết thúc bằng [...]chuỗi đã rút gọn
import textwrap

# dedent: loại thụt lề khỏi chuỗi triple-quote
raw = """
    Xin chào.
    Hôm nay trời đẹp.
    """
print(textwrap.dedent(raw).strip())
# Xin chào.
# Hôm nay trời đẹp.

# fill: xuống dòng (tiếng Anh thể hiện rõ nhất)
long_text = "Python is a language that lets you work quickly and integrate systems."
print(textwrap.fill(long_text, width=30))
# Python is a language that
# lets you work quickly and
# integrate systems.

Kết hợp dedent với strip

Chuỗi triple-quote thường bắt đầu và kết thúc bằng ký tự xuống dòng, nên dòng textwrap.dedent(raw).strip() (dedent + cắt khoảng trắng hai đầu) là pattern phổ biến. strip là method có sẵn của chuỗi, loại bỏ khoảng trắng (kể cả ký tự xuống dòng) ở cả hai đầu.

Làm sạch một template thông báo lỗi viết với thụt lề bằng dedent, rồi xuống dòng một câu tiếng Anh bằng fill.

① Hãy import textwrap.

② Hãy định nghĩa một chuỗi tiếng Anh 2 dòng có thụt lề 4 khoảng trắng trong triple-quote (có dòng trống ở đầu và cuối).

③ Hãy loại bỏ thụt lề và khoảng trắng hai đầu, in --- sau dedent --- trước rồi mới in kết quả.

④ Hãy xuống dòng câu tiếng Anh "Python is a language that lets you work quickly and integrate systems." với độ rộng 30 ký tự, in --- sau fill --- trước rồi mới in kết quả.

Python Editor

Chạy code để xem đầu ra
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Kết quả của string.Template("Hi $name").substitute(name="Bob") là gì?

Câu 2Cái nào loại bỏ thụt lề chung ở đầu khỏi văn bản viết trong triple quote (có thụt lề ở mã nguồn)?

Câu 3textwrap.fill(text, width=20) làm gì?