textwrap – 段落内のテキストを整形する

目的:段落内のテキストの改行位置を調整して整形する
利用できるバージョン:2.5

textwrap モジュールは、人間が見易いように表示したいときにテキストを整形するのに使用されます。多くのテキストエディタにある、段落内のテキストの折り返しや詰め込みといった機能がプログラミングできます。

サンプルデータ

サンプルプログラムは、以下の textwrap_example.pysample_text を使用します。



sample_text = ‘’’
        The textwrap module can be used to format text for output in situations
        where pretty-printing is desired.  It offers programmatic functionality similar
        to the paragraph wrapping or filling features found in many text editors.
        ‘’’

段落の詰め込み

fill() は便利な関数でテキストを入力として受け取り、整形されたテキストを出力します。sample_text を渡して、その整形処理がどのように行われるかを見てみましょう。

import textwrap
from textwrap_example import sample_text

print 'No dedent:\n'
print textwrap.fill(sample_text)

実行結果は望むものとはちょっと違うようです。

$ python textwrap_fill.py
No dedent:

         The textwrap module can be used to format text for output in
situations         where pretty-printing is desired.  It offers
programmatic functionality similar         to the paragraph wrapping
or filling features found in many text editors.

既存インデントの削除

埋め込まれたタブと余分なスペースが実行結果の出力に混在していることに注目してください。それはあまりにも見辛いものです。サンプルテキストの全行から接頭辞のスペースを削除すればもっと良くなります。これは Python のコードそのもののフォーマットを削除する一方で、そのコードから直接的に埋め込まれた複数行の文字列や docstring が使用できます。サンプルの文字列は、この機能を分かり易く説明するためにわざわざインデントしています。

import textwrap
from textwrap_example import sample_text

dedented_text = textwrap.dedent(sample_text).strip()
print 'Dedented:\n'
print dedented_text

実行結果はずっと見易くなります。

$ python textwrap_dedent.py
Dedented:

The textwrap module can be used to format text for output in situations
where pretty-printing is desired.  It offers programmatic functionality similar
to the paragraph wrapping or filling features found in many text editors.

“dedent” の対義語は “indent” なので、その実行結果はテキストの段落から各行の最初にあるスペースが削除されています。ある行が他の行よりもインデントされていると、いくつかのスペースは削除されません。

 One tab.
 Two tabs.
One tab.

は次のようになります。

One tab.
Two tabs.
One tab.

インデント除去と詰め込みの組み合わせ

次にインデントが除去されたテキストを受け取り width の値を変更して fill() へ渡すとどうなるかを見てみましょう。



import textwrap
from textwrap_example import sample_text

dedented_text = textwrap.dedent(sample_text).strip()
for width in [ 20, 60, 80 ]:
        print
        print ‘%d Columns:\n’ % width
        print textwrap.fill(dedented_text, width=width)

出力幅をいろいろ指定した出力は次のようになります。

$ python textwrap_fill_width.py

20 Columns:

The textwrap module
can be used to
format text for
output in situations
where pretty-
printing is desired.
It offers
programmatic
functionality
similar to the
paragraph wrapping
or filling features
found in many text
editors.

60 Columns:

The textwrap module can be used to format text for output in
situations where pretty-printing is desired.  It offers
programmatic functionality similar to the paragraph wrapping
or filling features found in many text editors.

80 Columns:

The textwrap module can be used to format text for output in situations where
pretty-printing is desired.  It offers programmatic functionality similar to the
paragraph wrapping or filling features found in many text editors.

インデントのぶら下げ

出力幅の他にも、最初の行に続くそれ以降の行のインデントを制御できます。

import textwrap
from textwrap_example import sample_text

dedented_text = textwrap.dedent(sample_text).strip()
print textwrap.fill(dedented_text, initial_indent='', subsequent_indent='    ')

これは最初の行がその他の行よりもインデントが少ないので、比較的、インデントのぶら下げを生成し易いです。

$ python textwrap_hanging_indent.py
The textwrap module can be used to format text for output in
    situations where pretty-printing is desired.  It offers
    programmatic functionality similar to the paragraph wrapping or
    filling features found in many text editors.

インデントの値にはスペース以外の文字も含められます。そのため、インデントのぶら下げは箇条書き等を生成するために * を接頭辞にすることもできます。それは古い zwiki の内容を変換するときにそのまま Trac へインポートできるのでかなり重宝します。私は zwiki のデータの解析に Zope の StructuredText パッケージを使用して、Trac の wiki マークアップになるようにフォーマッタを作成しました。 textwrap を使用すると変換後に手作業での微調整がほとんど必要なかったので、その出力ページを整形することができました。

See also

textwrap
本モジュールの標準ライブラリドキュメント
テキスト処理ツール
テキストを処理するその他のツール
Bookmark and Share