Περιτύλιξη, αποκοπή και μορφοποίηση συμβολοσειρών στην Python με το textwrap

Επιχείρηση

Για να μορφοποιήσετε μια συμβολοσειρά στην Python, τυλίγοντάς την (διακόπτοντας τη γραμμή) και κόβοντάς την (συντομεύοντάς την) σε έναν αυθαίρετο αριθμό χαρακτήρων, χρησιμοποιήστε την ενότητα textwrap της τυπικής βιβλιοθήκης.

Οι ακόλουθες πληροφορίες παρέχονται εδώ.

  • Αναδίπλωση μιας συμβολοσειράς (τροφοδοσία γραμμής): wrap(),fill()
  • Αποκοπή συμβολοσειρών (παραλείπεται): shorten()
  • Αντικείμενο TextWrapper

Αν θέλετε να γράφετε μεγάλες συμβολοσειρές σε πολλές γραμμές στον κώδικα αντί στην έξοδο, ανατρέξτε στο ακόλουθο άρθρο.

Αναδίπλωση μιας συμβολοσειράς (τροφοδοσία γραμμής): wrap(), fill()

Με τη συνάρτηση wrap() της ενότητας textwrap, μπορείτε να πάρετε μια λίστα διαιρεμένη με διαλείμματα λέξεων ώστε να χωρέσει σε έναν αυθαίρετο αριθμό χαρακτήρων.

Καθορίστε τον αριθμό των χαρακτήρων για το πλάτος του δεύτερου ορίσματος. Η προεπιλογή είναι 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']

Χρησιμοποιώντας τη λίστα που λάβατε, μπορείτε να λάβετε μια συμβολοσειρά που διακόπτεται από έναν κώδικα νέας γραμμής κάνοντας τα εξής
'\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

Η συνάρτηση fill() επιστρέφει μια συμβολοσειρά νέας γραμμής αντί για μια λίστα. Είναι το ίδιο με την εκτέλεση του ακόλουθου κώδικα μετά την wrap() όπως στο παραπάνω παράδειγμα.
'\n'.join(list)

Αυτό είναι πιο βολικό όταν δεν χρειάζεστε μια λίστα αλλά θέλετε να εξάγετε μια συμβολοσειρά σταθερού πλάτους σε ένα τερματικό, κλπ.

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

Εάν καθοριστεί το όρισμα max_line, ο αριθμός των γραμμών μετά από αυτό θα παραλειφθεί.

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 [...]

Αν παραλειφθεί, η ακόλουθη συμβολοσειρά θα εξάγεται στο τέλος από προεπιλογή.
' [...]'

Μπορεί να αντικατασταθεί από οποιαδήποτε συμβολοσειρά με το όρισμα placeholder.

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

Μπορείτε επίσης να καθορίσετε μια συμβολοσειρά που θα προστεθεί στην αρχή της πρώτης γραμμής με το όρισμα initial_indent. Αυτό μπορεί να χρησιμοποιηθεί όταν θέλετε να κάνετε εσοχή στην αρχή μιας παραγράφου.

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 ~

Να είστε προσεκτικοί με χαρακτήρες πλήρους και μισού μεγέθους.

Στο textwrap, ο αριθμός των χαρακτήρων ελέγχεται από τον αριθμό των χαρακτήρων, όχι από το πλάτος των χαρακτήρων, και τόσο οι χαρακτήρες ενός byte όσο και οι χαρακτήρες διπλού byte θεωρούνται ως ένας χαρακτήρας.

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

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

Αν θέλετε να τυλίξετε ένα κείμενο με μικτούς χαρακτήρες kanji με σταθερό πλάτος, ανατρέξτε στα παρακάτω.

Αποκοπή συμβολοσειρών (παραλείπεται): shorten()

Αν θέλετε να περικόψετε και να παραλείψετε συμβολοσειρές, χρησιμοποιήστε τη συνάρτηση shorten() στην ενότητα textwrap.

Συντομευμένη σε μονάδες λέξης για να χωρέσει ένας αυθαίρετος αριθμός χαρακτήρων. Ο αριθμός των χαρακτήρων, συμπεριλαμβανομένης της συμβολοσειράς που υποδεικνύει την παράλειψη, είναι αυθαίρετος. Η συμβολοσειρά που υποδεικνύει την παράλειψη μπορεί να οριστεί με το όρισμα placeholder, το οποίο έχει ως προεπιλογή το ακόλουθο.
' [...]'

s = 'Python is powerful'

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

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

Ωστόσο, οι ιαπωνικές συμβολοσειρές, για παράδειγμα, δεν μπορούν να συντομευθούν καλά, επειδή δεν μπορούν να χωριστούν σε λέξεις.

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

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

Αν θέλετε να συντομεύσετε λαμβάνοντας υπόψη μόνο τον αριθμό των χαρακτήρων αντί των μονάδων λέξης, αυτό μπορεί να επιτευχθεί εύκολα ως εξής.

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

Αντικείμενο TextWrapper

Αν πρόκειται να αναδιπλώσετε() ή να συμπληρώσετε() πολλές φορές με μια σταθερή διαμόρφωση, είναι αποδοτικό να δημιουργήσετε ένα αντικείμενο TextWrapper.

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 ~

Οι ίδιες ρυθμίσεις μπορούν να επαναχρησιμοποιηθούν.