Gói, cắt ngắn và định dạng chuỗi trong Python với textwrap

Kinh doanh

Để định dạng một chuỗi trong Python bằng cách gói (ngắt dòng) và cắt ngắn (viết tắt) nó ở một số ký tự tùy ý, hãy sử dụng mô-đun textwrap của thư viện chuẩn.

Thông tin sau được cung cấp ở đây.

  • Bao bọc một chuỗi (nguồn cấp dòng):wrap(),fill()
  • Cắt ngắn chuỗi (bỏ qua):shorten()
  • Đối tượng TextWrapper

Nếu bạn muốn viết chuỗi dài trên nhiều dòng trong mã thay vì trong đầu ra, hãy xem bài viết sau.

Bao bọc một chuỗi (nguồn cấp dòng):wrap(),fill()

Với hàm wrap () của mô-đun textwrap, bạn có thể nhận được một danh sách được chia theo các ngắt từ để vừa với một số ký tự tùy ý.

Chỉ định số ký tự cho chiều rộng đối số thứ hai. Giá trị mặc định là width = 70.

import textwrap

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

s_wrap_list = textwrap.wrap(s, 40)
print(s_wrap_list)
# ['Python can be easy to pick up whether', "you're a first time programmer or you're", 'experienced with other languages']

Sử dụng danh sách thu được, bạn có thể lấy một chuỗi bị ngắt bởi mã dòng mới bằng cách thực hiện như sau
\n'.join(list)

print('\n'.join(s_wrap_list))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

Hàm fill () trả về một chuỗi dòng mới thay vì một danh sách. Nó cũng giống như việc thực thi đoạn mã sau sau khi bọc () như trong ví dụ trên.
\n'.join(list)

Điều này thuận tiện hơn khi bạn không cần danh sách nhưng muốn xuất một chuỗi có độ rộng cố định đến một thiết bị đầu cuối, v.v.

print(textwrap.fill(s, 40))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

Nếu đối số max_line được chỉ định, số dòng sau nó sẽ bị bỏ qua.

print(textwrap.wrap(s, 40, max_lines=2))
# ['Python can be easy to pick up whether', "you're a first time programmer or [...]"]

print(textwrap.fill(s, 40, max_lines=2))
# Python can be easy to pick up whether
# you're a first time programmer or [...]

Nếu bị bỏ qua, chuỗi sau sẽ được xuất ở cuối theo mặc định.
[...]'

Nó có thể được thay thế bằng bất kỳ chuỗi nào có trình giữ chỗ đối số.

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~'))
# Python can be easy to pick up whether
# you're a first time programmer or ~

Bạn cũng có thể chỉ định một chuỗi được thêm vào đầu dòng đầu tiên với đối số initial_indent. Điều này có thể được sử dụng khi bạn muốn thụt lề đầu đoạn văn.

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~', initial_indent='  '))
#   Python can be easy to pick up whether
# you're a first time programmer or ~

Hãy cẩn thận với các ký tự kích thước đầy đủ và nửa kích thước.

Trong textwrap, số lượng ký tự được kiểm soát bởi số lượng ký tự, không phải bởi độ rộng của ký tự và cả ký tự byte đơn và byte kép đều được coi là một ký tự.

s = '文字文字文字文字文字文字12345,67890, 文字文字文字abcde'

print(textwrap.fill(s, 12))
# 文字文字文字文字文字文字
# 12345,67890,
# 文字文字文字abcde

Nếu bạn muốn bọc một văn bản với các ký tự kanji hỗn hợp với chiều rộng cố định, vui lòng tham khảo cách sau.

Cắt ngắn chuỗi (bỏ qua):shorten()

Nếu bạn muốn cắt ngắn và bỏ qua các chuỗi, hãy sử dụng hàm rút gọn () trong mô-đun textwrap.

Được viết tắt theo đơn vị từ để phù hợp với số lượng ký tự tùy ý. Số lượng ký tự, bao gồm cả chuỗi biểu thị sự thiếu sót, là tùy ý. Chuỗi chỉ ra sự thiếu sót có thể được đặt bằng trình giữ chỗ đối số, được đặt mặc định như sau.
[...]'

s = 'Python is powerful'

print(textwrap.shorten(s, 12))
# Python [...]

print(textwrap.shorten(s, 12, placeholder=' ~'))
# Python is ~

Tuy nhiên, các chuỗi trong tiếng Nhật, chẳng hạn, không thể được viết tắt tốt vì chúng không thể được chia thành các từ.

s = 'Pythonについて。Pythonは汎用のプログラミング言語である。'

print(textwrap.shorten(s, 20))
# [...]

Nếu bạn muốn viết tắt bằng cách chỉ xem xét số lượng ký tự thay vì đơn vị từ, nó có thể dễ dàng đạt được như sau.

s_short = s[:12] + '...'
print(s_short)
# Pythonについて。P...

Đối tượng TextWrapper

Nếu bạn định bọc () hoặc điền () nhiều lần với một cấu hình cố định, thì việc tạo một đối tượng TextWrapper sẽ rất hiệu quả.

wrapper = textwrap.TextWrapper(width=30, max_lines=3, placeholder=' ~', initial_indent='  ')

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

print(wrapper.wrap(s))
# ['  Python can be easy to pick', "up whether you're a first time", "programmer or you're ~"]

print(wrapper.fill(s))
#   Python can be easy to pick
# up whether you're a first time
# programmer or you're ~

Các cài đặt tương tự có thể được sử dụng lại.