バージョン 2.3 で 新たに追加 された仕様です。
textwrapモジュールでは、二つの簡易関数wrap()と fill()、そして作業のすべてを行うクラスTextWrapper とユーティリティ関数 dedent() を提供しています。 単に一つや二つのテキスト文字列の折り返しまたは詰め込みを行っている ならば、簡易関数で十分間に合います。そうでなければ、 効率のためにTextWrapperのインスタンスを使った方が良いでしょう。
text[, width[, ...]]) |
オプションのキーワード引数は、以下で説明するTextWrapperのインスタンス属性に対応しています。widthはデフォルトで70
です。
text[, width[, ...]]) |
"\n".join(wrap(text, ...))
特に、fill()はwrap()とまったく同じ名前のキーワード引数を受け取ります。
wrap()とfill()の両方ともがTextWrapperインスタンスを作成し、その一つのメソッドを呼び出すことで機能します。そのインスタンスは再利用されません。したがって、たくさんのテキスト文字列を折り返し/詰め込みを行うアプリケーションのためには、あなた自身のTextWrapperオブジェクトを作成することでさらに効率が良くなるでしょう。
追加のユーティリティ関数である dedent() は、不要な 空白をテキストの左側に持つ文字列からインデントを取り去ります。
text) |
この関数は通常、三重引用符で囲われた文字列をスクリーン/その他の 左端にそろえ、なおかつソースコード中ではインデントされた形式を 損なわないようにするために使われます。
タブとスペースはともにホワイトスペースとして扱われますが、同じではないこ
とに注意してください: " hello"
という行と
"\thello"
は、同じ先頭の空白文字をもっていない
とみなされます。(このふるまいは Python 2.5で導入されました。古いバージョ
ンではこのモジュールは不正にタブを展開して共通の先頭空白文字列を探して
いました)
以下に例を示します:
def test(): # end first line with \ to avoid the empty line! s = '''\ hello world ''' print repr(s) # prints ' hello\n world\n ' print repr(dedent(s)) # prints 'hello\n world\n'
...) |
wrapper = TextWrapper(initial_indent="* ")
wrapper = TextWrapper() wrapper.initial_indent = "* "
あなたは同じTextWrapperオブジェクトを何回も再利用できます。また、使用中にインスタンス属性へ代入することでそのオプションのどれでも変更できます。
TextWrapperインスタンス属性(とコンストラクタのキーワード引数)は以下の通りです:
70
) 折り返しが行われる行の最大の長さ。入力行にwidthより長い単一の語が無い限り、TextWrapperはwidth文字より長い出力行が無いことを保証します。
True
) もし真ならば、そのときはtext内のすべてのタブ文字はtextのexpand_tabs()メソッドを用いて空白に展開されます。
True
) もし真ならば、タブ展開の後に残る(string.whitespace
に定義された)空白文字のそれぞれが一つの空白と置き換えられます。注意:
expand_tabsが偽でreplace_whitespaceが真ならば、各タブ文字は一つの空白に置き換えられます。それはタブ展開と同じではありません。
''
) 折り返しが行われる出力の一行目の先頭に付けられる文字列。一行目の折り返しの長さになるまで含められます。
''
) 一行目以外の折り返しが行われる出力のすべての行の先頭に付けられる文字列。一行目以外の各行が折り返しの長さまで含められます。
False
) もし真ならば、TextWrapperは文の終わりを見つけようとし、確実に文がちょうど二つの空白で常に区切られているようにします。これは一般的に固定スペースフォントのテキストに対して望ましいです。しかし、文の検出アルゴリズムは完全ではありません: 文の終わりには、後ろに空白がある"."、"!"または"?"の中の一つ、ことによると"""あるいは"'"が付随する小文字があると仮定しています。これに伴う一つの問題は
[...] Dr. Frankenstein's monster [...]
の``Dr.''と
[...] See Spot. See Spot run [...]
の``Spot.''の間の差異を検出できないアルゴリズムです。
fix_sentence_endingsはデフォルトで偽です。
文検出アルゴリズムは``小文字''の定義のためにstring.lowercase
に依存し、同一行の文を区切るためにピリオドの後に二つの空白を使う慣習に依存しているため、英文テキストに限定されたものです。
True
) もし真ならば、そのときwidthより長い行が確実にないようにするために、widthより長い語は切られます。偽ならば、長い語は切られないでしょう。そして、widthより長い行があるかもしれません。(widthを超える分を最小にするために、長い語は単独で一行に置かれるでしょう。)
TextWrapperはモジュールレベルの簡易関数に類似した二つの公開メソッドも提供します:
text) |
text) |