前回は下記リンクからご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その3
Pythonのmimetypes
ライブラリは、ファイルのMIMEタイプと拡張子を判定するのに便利なツールです。MIMEとは、Multipurpose Internet Mail Extensionsの略で、インターネット上のファイルをその性質や形式に応じて識別するための方法です。例えば、MIMEタイプを使うことでブラウザは適切な拡張子を持つファイルを開くことができます。Pythonのmimetypes
モジュールは、URLやファイル名からファイルの種類を判断する関数を提供しています。
この例では与えられたファイルのMIMEタイプを返すguess_type()
関数を使用しています。ここでは、myfile.pdf
はapplication/pdf
として識別されています。
mimetypes
モジュールはMIMEデータベースと対話する方法を提供します。add_type()
メソッドを使って新しい型や拡張子をデータベースに追加したり、types_map
を使ってすべての既知のMIMEタイプのリストを取得したりできます。
ここではPythonでコンパイルされたファイル用に新しいタイプを追加し、guess_type()
でテストしています。そして、既知のMIMEタイプをすべて表示しています。
様々な種類のファイルが頻繁にやり取りされる世界では、MIMEタイプを理解し扱うことは必須のスキルです。Pythonのmimetypes
ライブラリは、このタスクを簡略化しカスタマイズや拡張を容易にします。
最初の例ではtext/html
タイプに対して可能なすべての拡張子を見つけるためにguess_all_extensions()
メソッドが使用されます。2番目の例では、guess_type()
がファイルのエンコーディングも返しています。これはPythonでファイルタイプやエンコーディングを扱う際のmimetypes
の実用的な使い方を示しています。
Pythonのbase64
モジュールは、バイナリデータをASCII文字にエンコードおよびデコードするための重要なツールです。バイナリデータをエンコードする必要がある場合、特にテキストを扱う目的で設計されたプロトコル上において、データを送信する必要があるケースで使用される技術です。画像や文書など、送信や保存に安全な形式へと変換する必要がある特定の種類のファイルを扱っている場合に便利です。
ここでは単純な文字列Hello, Python!
をエンコードしています。b64encode()
関数はbytesライクなオブジェクトを必要とするので、まずencode()
を使って文字列をbytesに変換しています。
base64
モジュールはデータをエンコードおよびデコードするための一連の関数を提供します。データをエンコードした後、デコードして元の形式に戻す必要のある場合があります。これはb64decode()
関数を使用して行うことができます。
b64decode()
はbytesのようなオブジェクトを返し、decode()
で文字列に戻します。
base64
モジュールは多くの実用的なケースで有用であることが証明されています。典型的な使用例としては、複雑さを隠したい場合やデータの保存や転送の際に意図しない改変からデータを保護する必要がある場合です。また、base64
でエンコードされたデータを必要とするAPIを使用する場合にも使用されます。
ここでは画像ファイルをバイナリモードで開き、その内容を読み取りエンコードしています。特殊文字による破損を心配することなく、安全に送信・保存できます。
Pythonのxml
ライブラリは、XMLデータを解析・作成するための堅牢なツールです。XML(Extensible Markup Language)はHTMLによく似たマークアップ言語です。XMLは設定ファイルやWebサービスなどのデータ保存やデータ転送によく使われ、文書ファイル形式としても機能します。Pythonのxml
ライブラリには、xml.dom
、xml.sax
、xml.etree.ElementTree
モジュールなど、XMLをパースするための様々なモジュールが付属しています。
この例ではElementTree
モジュールを使って、1つのルートノードと1つの子ノードを持つ単純なXMLデータを作成します。
XMLデータの解析はxml
ライブラリの真価が問われるところです。XMLドキュメントを読み込んでデータを抽出したり、必要に応じて操作したりできます。
ここでは先に作成したsample.xml
ファイルを読み込んでいます。ファイルを読み込むにはparse()
関数を使い、ルート要素を取得するにはgetroot()
を使用します。そして、各子ノードのタグとテキストを表示しています。
xml
ライブラリは特にデータ交換やWebサービスを扱うPython開発者のツールボックスにおいて重要なツールです。多くのAPIやWebサービスでは、通信にXML形式を使用しており、Pythonのxml
ライブラリを使用すればそのようなデータの取り扱いが効率的になります。
この例では、ET.fromstring()
を使って文字列からXMLデータをパースする方法を紹介します。これはXMLレスポンスを返すAPIを扱うときに便利です。
Pythonのurllib
ライブラリは、URLを扱うためのPythonの標準ユーティリティモジュールが付属しているパッケージです。HTTPリクエストの送信、リクエストヘッダの変更、URLの解析など、HTTPやURLに関連する多くのタスクのための機能性を提供します。
ここではurllib.request.urlopen
を使用して、Webサイトへの簡単なHTTPリクエストを行っています。レスポンスオブジェクトのstatus
属性は、HTTPステータスコードを教えてくれます。
urllib
にはURLを構成要素に分解し、URLのエンコード/デコードを処理するためのurlparse
とquote
モジュールも含まれています。
ここでurlparse
はURLを構成要素に分解します。unquote
はURLエンコードされた文字列をデコードし、quote
はその逆を行います。
urllib
ではリクエストの中でHTTPヘッダを扱ったり、POSTデータを送信したりできます。これはWebスクレイピングやAPI利用のように、ヘッダーやPOSTデータが重要な役割を果たすタスクに不可欠です。
この例ではヘッダーにUser-Agent
を設定し、urlencode
を使用してPOSTデータを送信しています。データはシンプルなHTTPリクエスト/レスポンスサービスである http://httpbin.org/post
に送信されます。
Pythonのhttp
モジュールは、HTTP関連のモジュールやクラスを集めたパッケージです。直接使うことはあまりありませんがhttp.server
やhttp.client
など、サーバーやクライアントの機能を提供する他のモジュールの基礎となっています。
ここではHTTPリクエストを送信できるhttp.client
モジュールの簡単な使い方を紹介します。
このコードでは、www.python.org
への接続を確立し、GETリクエストを送信し応答ステータスを取得しています。
http.server
はシンプルで強力なモジュールで、わずか数行のコードでHTTPサーバーを作成できます。これは迅速なテストサーバーを作成するのに非常に便利です。
上記の例ではポート8000
でlocalhost
のカレントディレクトリからファイルを提供する単純なHTTPサーバーを作成しています。
http.HTTPStatus
はHTTPステータスコードを表します。HTTPレスポンスを扱う際にレスポンスのステータスを確認したい場合に便利です。
これは以下を出力します。
HTTPStatus.OK
が200
のステータスコード、HTTPStatus.NOT_FOUND
が404
のステータスコードを表していることを表しています。
Pythonのuuid
モジュールは、UUID(universally unique identifiers)の生成に使用されます。UUIDは128ビットの値で、グローバルに一意であるため、衝突(同じUUIDを複数回生成すること)の確率が極めて低くなっています。データベースや分散システムなど、一意な識別子が必要な場合によく使われます。
uuid
モジュールの基本的な使い方はランダムなUUIDを生成することです。以下はその例です。
このスクリプトではuuid4
関数がランダムなUUIDを生成します。これを実行すると、123e4567-e89b-12d3-a456-426655440000
のようなUUIDを出力します。
uuid
モジュールはランダムなUUID以外にも、以下のような手法でUUIDを生成できます。
uuid1
)uuid3
)uuid5
)UUIDを生成するこれらの他の方法は特定の要件に対して有用です。
UUIDはUUID標準の一部であるいくつかのフィールドで構成されています。これらのフィールドにはUUIDオブジェクトの属性でアクセスできます。
UUIDのバージョン番号、48ビットのノード値、32文字の16進文字列として表現されたUUIDが出力されます。これらのUUIDフィールドを理解することはより高度なユースケースに役立つことがあります。
Pythonのxmlrpc
ライブラリは、XML-RPCプロトコルを使用して、異なるマシンで動作し、異なる言語で書かれた可能性のあるソフトウェア間の通信を可能にする強力なツールです。このライブラリにはXML-RPCクライアントとサーバーの両方を作成するためのモジュールが含まれています。
まずPythonによるXML-RPCサーバーの基本的な例から見ていきましょう。
この例ではローカルマシンのポート8000
でリッスンするXML-RPCサーバを作成します。このサーバーはクライアントからリモートで呼び出すことができる関数add_numbers
を提供します。
サーバを作成したのでサーバと通信するクライアントを作成します。クライアントはサーバーが提供するadd_numbers
関数を呼び出すことができます。
このスクリプトでは先に起動したサーバーへ接続するXML-RPCクライアントを作成しています。クライアントはadd
関数(サーバではadd_numbers
関数)を呼び出し、3、5という数字を渡しています。
xmlrpc
ライブラリはリモートプロシージャコール中に発生する可能性のあるエラーを処理する方法も提供しています。Fault
クラスはXML-RPCのフォルト(XML-RPCサーバーのエラー)を表します。
このスクリプトではXML-RPCのフォルトが発生したときに発生するFault
例外をキャッチしています。サーバーがZeroDivisionError
に遭遇するとクライアントに失敗したことを送信し、それを処理してプリントアウトできます。
Pythonのgettext
は、国際化(i18n)を意識したアプリケーションを開発する上で重要なライブラリです。このライブラリはメッセージカタログにアクセスするための柔軟でわかりやすいAPIを提供することで、Pythonのプログラムを多言語にローカライズ(翻訳)する方法を提供しています。
次の例ではgettext
を使って簡単な挨拶メッセージをフランス語に翻訳する方法を説明します。
この例ではlocale/fr/LC_MESSAGES/
ディレクトリにあるmyapplication.mo
ファイルが、メッセージ"Hello, World"のフランス語訳を内包していると仮定しています。
gettext
を使う前に、メッセージカタログ(サポートしたい各言語の翻訳を含むファイル)を作成する必要があります。ソースコードから翻訳可能な文字列を抽出するためにpygettext
ツールを使用し、バイナリの.mo
ファイルへコンパイルするためにmsgfmt
を使用します。
gettext
ライブラリは言語によって大きく異なる可能性のある複数形をサポートしています。ngettext
メソッドがこれを処理します。
ここではngettext
が数字nに基づいて正しい形を選択しています。これはgettext
のパワーのほんの一例で、コンテキストサポートやフォールバック翻訳などもっと多くの機能があります。
Pythonのlocale
モジュールは、POSIXロケールデータベースと機能へのゲートウェイとしての役割を担っています。これは言語、通貨フォーマット、日付と時刻の表記などに影響を与え、プログラムが地域設定と相互作用する方法をカスタマイズするための優れたツールです。
ここでは、ロケールを特定の言語環境に設定する方法の例を示します。例えば、UTF-8エンコーディングの米国英語を表すen_US.UTF-8
を使ってみましょう。
ロケールを設定した後はロケールメソッドを使って、地域設定に応じた文字列の書式を設定できます。
locale
モジュールには現在または指定されたロケールに準拠した方法で数値をフォーマットする機能があります。例えば、千の区切り文字を使った数値の書式設定や、浮動小数点数をロケール固有の小数点で書式設定したい場合があります。
上記のコードでは%d
と%.2f
はprintf
スタイルのような標準的な書式指定ですが、locale.format()
と併用するとロケールを意識した書式になります。
数値の書式以外にもlocale
はPythonの日付、時刻、通貨の表示方法にも影響します。locale
モジュールにはロケールに応じた文字列を比較するlocale.nl_langinfo()
, locale.currency()
など、これらを扱うための関数があります。
これらの機能によりユーザーの言語や文化的慣習に配慮したプログラムを作成し、ユーザビリティやアクセシビリティを向上させることができます。
tkinter
は、Tk GUIツールキットへの標準的なPythonインターフェースです。PythonでGUIアプリケーションを作成するための最も簡単で迅速な方法の1つです。Pythonがインストールされている場合、tkinter
はPythonに標準パッケージとして同梱されているのでほとんどの場合、すぐに使うことができます。
tkinter
を使ってウィンドウを作成するのは非常に簡単です。以下は非常に基本的な例です。
上記のコードを実行すると新しいウィンドウがポップアップ表示されます。このウィンドウはボタン、ラベル、テキストボックスなどを追加するためのキャンバスとなります。
ウィジェットはGUIを構成する要素です。tkinter
には、Label
、Button
、Text
、Entry
など、数多くのウィジェットが用意されています。ウィジェットを使用するにはまずクラスのインスタンスを作成し、それをウィンドウに追加する必要があります。
ここではLabel
とButton
を作成する簡単な例を示します。
pack()
メソッドはtkinter
のジオメトリマネージャの1つです。このメソッドは、親ウィンドウ内でウィジェットに割り当てられたスペースを提供する責任を負います。
Button
やEntry
のようなウィジェットには、特定のイベントにPythonの関数を関連付けるオプションが用意されています。
ここではボタンをクリックしたときに関数をバインドする基本的な例を示します。
上のコードではボタンをクリックするとsay_hello
関数が呼び出され、コンソールにメッセージが出力されます。これは氷山の一角にすぎません。tkinter
は様々なユーザーインタラクションを持つ複雑なGUIアプリケーションを作成できます。
Pythonのtyping
モジュールは、Pythonがタイプヒントをサポートするための基本的な部分です。Python 3.5でPython言語をより堅牢にする手段として導入されました。型付けモジュールを使用することで入力と出力の期待される型を指定でき、コードのデバッグやコードの理解を深め、IDEをより便利なものにできます。
以下はタイプヒントを使った関数の例です。
この例ではnames
は文字列のリストであることが期待されます。この関数は何も返さないのでNone
と表記されます。
typing
モジュールには、Optional、Tuple
、Dict
など、さまざまな複雑な型を表すクラスが用意されています。例えば、文字列やNone
を返す関数がある場合、Optional[str]
を戻り値型として使用できます。
以下はその例です。
上記の例では関数find_first
はnames
の中からtarget
のインデックスを探そうとします。見つかった場合はそのインデックス(整数)を返し、そうでない場合はNone
を返します。
Pythonのインタプリタは型ヒントを強制しませんが、mypy
という別のツールがあり、それを使ってコードの型の整合性をチェックできます。これは「静的型チェック」と呼ばれています。
ここではPythonスクリプトに対してmypy
を実行する方法を説明します。
先ほどの例ではmypy
は何もエラーを報告しませんでした。しかし、greet_all(123)
を呼び出そうとすると、文字列のリストを渡していないためmypy
がエラーを報告します。
Pythonの型付けモジュールとmypy
ツールは、あなたのコードをより堅牢で理解しやすくするためにあることを忘れないでください。これらは完全にオプションであり、あなたのコードを改善するためのツールとして使用されるべきであり、要件として使用するものではありません。
Pythonプログラミングの領域では、特に複雑なプログラムを扱う場合、コードの一部が何をするのかを理解するためにドキュメントが重要な役割を果たします。Pythonに内蔵されているpydoc
モジュールは、Pythonモジュールに関するドキュメントを作成したり、有用な情報を入手したりするための素晴らしいツールです。
ここではPythonスクリプトの中からpydocを使用する方法を説明します。
上記の例ではgetdoc
を使ってpydoc
モジュール自体の簡単なドキュメントを取得しています。また、ファイルシステム上のos
モジュールの場所を見つけるためにlocate
を使用しています。
pydoc
モジュールにはターミナルから直接使用できるコマンドラインインターフェイス (CLI) も付属しています。これはターミナルを離れることなくモジュールや関数のヘルプを得るのに特に便利です。pydoc CLIにアクセスするにはpydoc
と入力し、その後にヘルプを得たいモジュールまたは関数の名前を入力します。
以下はその例です。
上の例ではPythonのos
モジュールの説明、クラス、関数などに関するヘルプページが端末に表示されます。
pydoc
の強力な機能の1つに、ドキュメントを含むHTMLページを生成する機能があります。これはCLIで-w
フラグを使用することで実現できます。これは指定されたモジュールのHTMLページを作成しカレントディレクトリに保存します。
ここではos
モジュールのHTMLページを生成する方法を説明します。
doctest
モジュールは、Pythonのプログラム、特に関数、メソッド、およびクラスのドキュメントにテストを埋め込むための独創的な方法です。この機能はコードの文書化とテストのベストプラクティスを同時に促進します。
上の例では2つの数値を合計する関数add
を定義しています。docstring
にはこの関数の呼び出し例と、予想される結果を>>>
プロンプトに従って記述しています。そして、doctest.testmod()
関数は実際の結果が期待される結果と一致するかどうかをチェックします。
doctest
モジュールは関数と期待される出力の説明を書くことを促し、コードをより読みやすく貴重なツールです。doctest
は関数が期待通りに動作することを検証するための軽量な方法であり、簡単なテストやシンプルで説明的な例を文書化するために優れています。
この例では関数factorial
を定義し、docstring
内でいくつかの使用例を提供しています。doctest.testmod()
関数はfactorial
関数が期待される出力を生成するかどうかをチェックする。
doctest
はモジュール、関数、クラス、メソッドなど、あらゆるオブジェクトのdocstring
に含めることができます。また、doctest
モジュールはファイル内のすべてのdoctest
をチェックできるコマンドラインインターフェイスを提供します。これを使うにはPythonに-m doctest
オプションを付けてファイル名を指定します。
上のコマンドでは-v
フラグで詳細な出力を表示するverbose
モードが有効になっています。
続きは下記リンクからご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その5