【Python学習】出力整形に関して学んでみる

Pocket

前回に引き続き、Pythonチュートリアル第10章、第11章「標準ライブラリめぐり」の内容。

出力整形に関するモジュールに関して学習したことをまとめる。

出力整形とは

 

その名の通り、出力を整えてくれるモジュールが標準ライブラリとして用意されているという話。

Python チュートリアルでは、次の4つを取り上げている。

・reprlibモジュール

・pprintモジュール

・textwrapモジュール

・localeモジュール

 

順番に押さえていく。

 

reprlibモジュールとrepr()関数

 

Pythonチュートリアルでは、repr()関数の別バージョンと紹介されている。

このrepr()関数だけど、実は出力フォーマットの調整に関して学んだ時に取り上げている。

値を文字列に変換する方法のセクションで取り上げて、その時にrepr()関数を以下のように解釈した。

文字列が何のオブジェクトか分かるようにフォーマットする関数

初めに repr()関数を取り上げた投稿では、他サイトの以下の例でなんとかイメージを掴むにすぎなかった。

そして、「いずれ理解できるだろうか…」と結んでいたわけだけど、先述の青色で示した解釈で正しいみたいだ。

というのも、文字列をrepr()関数でフォーマッティングすると、以下のようになるが、これも文字列型オブジェクトであることを示していることに気付いたからだ。

 

さて、repr()関数を思い出したところで、本題のreprlibモジュールの話に戻ろうと思う。

Pythonチュートリアルでは、reprlibモジュールは以下のように説明されている。

巨大な、または深く入れ子になったコンテナオブジェクトを省略して表示する

まずは、言葉の意味を考えてみる。

コンテナオブジェクトは、リストやタプル、セット(集合)といった構造体のことだったはず。

大雑把に解釈すると、非常にごちゃごちゃしたコンテナを省略して出力してくれるということだよね。

とりあえず、物は試しということで、reprlibモジュールを試してみる。

というわけで、この例のように省略してくれる

しかも、アルファベット順にソートもしてくれる

ちなみに、reprlibモジュールに属さない、ビルトインのrepr()関数で出力してみると…

普通に出力した結果が「””」で囲まれるだけでソートもしてくれないし、見にくい。

reprlib.repr()は、repr()関数と比較して、省略してソートまでしてくれたうえで、オブジェクトもわかる

見にくくても全部表示したい時は repr()関数を使う方がいいのかな。

コンテナが入れ子になっているパターンも試してみた。

気付いたのは、7つ目のアイテム以降が省略されていること。

全体の大きなコンテナも、入れ子になっているコンテナも7つ目以降が省略されている。

これ、省略せずに表示させるアイテムの数とか変更できそうだな…

今回はそこまで試さないけど、気が向いたら調べたい。

 

pprintモジュール

 

Pythonチュートリアルの pprintモジュールの説明は以下の通り。

ビルトインオブジェクトにもユーザ定義オブジェクトにも使える洗練された出力制御を提供

説明だけだとよく分からないので、reprlibモジュールで作ったリストを使って試してみる。

おお、アイテムごとに改行して表示してくれるのね。これは見やすい。

それから、入れ子の部分は改行されないのかと思ったんだけど、調べてみると引数が色々あるみたい。

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)

8.11. pprint – データ出力の整然化 – Python 3.6.5 ドキュメント

色々試してみた。

コンテナオブジェクトを見やすく整形したい時にpprintモジュールが便利だというのは分かった。

引数でよくわからないものもあるけれど、今はそこまで押えなくてもいい気がする。

 

textwrapモジュール

 

textwrap.fill()関数を使うと、テキストを指定の幅に納まるように整形してくれるらしい。

早速試してみる。

あれ、整形されていない気がする…

あれこれ試していると、どうやらprint()関数の中に書くようにしないといけないらしい。

Python標準ライブラリのドキュメントには、print()関数の中に書く必要があるなんて記載は無いけど…

ちなみに、textwrap.fill()もpprint.pprint()と同様にwidthを指定して改行幅を指定できる(デフォルトは70とのこと)。

単語をちぎったりせずに綺麗に改行してくれるね。

 

localeモジュール

 

ちょっと投稿が長くなっているので、今回はPythonチュートリアルの内容にとどめようと思う。

ということで、このlocaleモジュールをまとめて今回は終わり。

localeモジュールといえば、前回の電池付属に関する投稿にて、国際化で少し触れている。

前回は、ロケーションに合わせた言語対応やら表記対応をしてくれると簡単に触れただけだった。

とりあえず、「23.2 locale – 国際化サービス – Python 3.6.5 ドキュメント」の内容を見ながら試してみたい。

 

localeをインポートしたら、まずは以下を実行するのが通常らしい。

これによって、今私が使っている環境に合わせて初期設定をしてくれるそうだ(例も日本の設定になってる)。

それから、locale.localeconv()を実行して現在のロケールの慣例データを取得する。

ちなみに、変数conv の中身を見てみると以下のようなデータが入っていた。

さっそくpprint.pprint()も使いこなしてしまったね。

Pythonチュートリアルでは、上記locale.localeconv()で取れるデータのうち、groupingを取り上げている。

「’grouping’: [3, 0]」というのがリストの上から4番目のアイテムにあるけど、これは数値の桁区切りに関する値。

つまり、groupingの値は何桁ずつに桁区切りするかを示している。

試しにやってみる。

groupingの値が3なので、3桁区切りとなったわけだね。

そして、例えばこういうこともできる。

locale.localeconvの慣例データを利用すると、以下のような整形もできる。

ドキュメントを見ると locale モジュールは他にもいろいろできるみたいだけど、今回はあくまでも整形がテーマだからPythonチュートリアルにもこれ以上言及が無いのだろう。

ということで、ここまでで投稿も終わりにしたい。長くなったし。

 

まとめ

 

文字列の出力整形にもいろいろあることが分かった。

関数の引数とか細かいところを覚えようとすると大変そう。

ドキュメントと睨めっこして覚えても覚えきれないと思うし、実際に使うなかで覚えていくのが最善だと思う。

今回はこの辺で。

Comments
Pocket

Related posts