Pythonのプログラミングでよく利用される膨大な標準ライブラリの便利さを再発見するために書きました。
Pythonの標準ライブラリにはオペレーティングシステムに関連するタスクを処理するのに役立つモジュールのスイートが用意されています。そのような強力なモジュールの1つが os
で、Windows、Mac、Linuxなど、Pythonが動作している基本的なオペレーティングシステムとのインターフェースを提供します。
os
モジュールを使って、ファイルやディレクトリの操作、環境変数の読み取り、プロセスのフォークなど、さまざまなことができます。ディレクトリの作成、ファイル名の変更、ディレクトリのウォークスルーなど、ファイルI/O操作したいときに便利です。
os
モジュールで行う最も一般的なタスクの1つはファイルシステムの操作です。 os
を使えば、ディレクトリの作成、削除、変更、ナビゲーションを行うことができます。以下は新しいディレクトリを作成する方法です。
また、以下のように現在の作業ディレクトリを変更したり、現在の作業ディレクトリの名前を取得したりできます。
また、 os
モジュールではオペレーティングシステムの環境変数の読み書きできます。これはデータベースのパスワードやAPIキー、その他の秘密のトークンなどの機密情報を隠したいときに便利です。
以下は、環境変数の読み書きの方法です。
Pythonの shutil
モジュールは高レベルのファイル操作するためのもう1つの強力なツールです。Pythonの標準ライブラリの一部である shutil
はPythonのインストール時に同梱されており、ファイルやディレクトリのコピー、移動、削除の機能を提供します。
os
モジュールと同様に、 shutil
は異なるオペレーティングシステム間でシームレスに動作しスクリプトをポータブルにします。
shutil
モジュールの一般的な使い方の1つにファイルやディレクトリのコピーや移動があります。これはそれぞれ copy()
関数と move()
関数を使用して行うことができます。以下はファイルをコピーするサンプルコードです。
ファイルを移動する方法は以下です。
上記のいずれの場合も、 src_file_path
と dst_directory_path
はそれぞれソースファイルとデスティネーションディレクトリのパスに置き換える必要があります。
shutil
のもう1つの使い方はファイルやディレクトリを削除することです。この目的のためにPythonは shutil.rmtree()
関数を提供しており、ディレクトリツリー全体、つまり、与えられたパス内のすべてのディレクトリとファイルを削除できます。
以下はその使用例です。
shutil.rmtree()
を不適切に使用すると重要なファイルを削除してしまう可能性があるため、使用中は注意する必要があることに注意してください。
プログラミングの世界では日付を表示するための書式設定、経過時間の計算、将来のタスクのスケジューリングなど、日付や時刻を扱うことはよくある作業です。Pythonの標準ライブラリに含まれる datetime
モジュールは、単純な方法から複雑な方法まで、日付と時刻を操作するためのクラスを提供しています。
datetime
モジュールには、date
、time
、datetime
、timedelta
などのクラスがあります。
datetime
モジュールでは、日付と時刻を個別に、または一緒に扱うことができます。ここでは、現在の日付と時刻を表す 'datetime' オブジェクトを作成する方法を説明します。
また、日付や時間のオブジェクトを簡単に作成できます。
上記の例では、date
オブジェクトは日付(年、月、日)を、time
オブジェクトは時間(時、分、秒、マイクロ秒)を表しています。
datetime
モジュールは2つの時点の時間差を計算するのにも便利です。これはtimedelta
オブジェクトを使って行うことができます。timedelta
オブジェクトは、期間、つまり2つの日付や時刻の差を表します。
この例では、2つの日付の間の日数を計算しています。同様に、2つの時間や2つのdatetimeオブジェクトの差を計算できます。
結論として、datetime
モジュールはPythonで日付と時刻を扱うための強力なツールです。現在の日時の取得から時差の計算まで、datetime
は日付と時間を簡単かつ直感的に扱うための様々な機能性を提供します。
ネットワークプログラミングの領域で、Pythonのsocket
モジュールは強力なツールです。Pythonの標準ライブラリの一部であるsocket
は、コンピュータ間のネットワーク通信のための柔軟なインターフェイスを提供します。TCP、UDP、RAWソケットなどの幅広いプロトコルをサポートしており、多くのネットワークタスクに汎用的に使用できます。
socket
はデータを送受信するネットワーク通信システムにおけるエンドポイントです。Pythonのsocket
モジュールを使うと、ソケットオブジェクトを作成し、様々なネットワーク関連のタスクのためにそれらを制御できます。
ソケットを作成するには新しいソケットオブジェクトを初期化し、通信の種類を指定する必要があります。ここではソケットを作成する基本的な例を紹介します。
上記のコードでは、socket.AF_INET
はIPv4を使っていることを、socket.SOCK_STREAM
はTCPソケットを作成していることを表しています。UDPソケットを作成する場合はsocket.SOCK_DGRAM
を使用します。
ソケットを作成したら、クライアント・サーバー通信の次のステップは接続を確立することです。クライアントはサーバーのIPアドレスとポート番号を使ってサーバーに接続します。
この例では、HTTPの標準ポートである80番ポートでPythonの公式サイトに接続しています。
接続が確立したらsend()
メソッドでサーバーにデータを送信し、recv()
メソッドでサーバーからデータを受信できます。通信が終わったらclose()
メソッドでソケットを閉じることが重要です。
Pythonでは、数学の演算は基本的な足し算、引き算、掛け算、割り算にとどまりません。より複雑な数学的計算のためにPythonは標準ライブラリの一部であるmath
モジュールを提供しています。math
モジュールには、三角法、複素数、対数、累乗などの関数が含まれています。
このモジュールは様々な数学関数、定数、計算ユーティリティを提供します。
math
モジュールは高度な数学的操作を可能にする関数の数々を提供します。例えば、数値の平方根を計算したり、数値の階乗を求めたり、角度のサイン、コサイン、タンジェントを計算できます。以下はその例です。
math
モジュールには様々な数学定数も用意されています。よく使われる定数はπ(math.pi
)とe(math.e
)ですが、他にもτ(2π)を表すmath.tau
や無限大を表すmath.inf
などが用意されています。
文字列はPythonで最もよく使われるデータ型の1つで、string
ライブラリは文字列の操作や対話のための追加機能を提供します。Pythonの標準ライブラリの一部として、string
には文字列処理のための定数やクラスが含まれています。
このモジュールでは文字列メソッド用の定数、高度な文字列書式のためのテンプレート文字列クラス、およびヘルパー関数を提供します。
string
モジュールは特定の文字列操作に役立つ様々な定数を提供しています。例えば、string.ascii_letters
はすべてのASCII文字(小文字と大文字の両方)を含み、string.digit
はすべての数字文字を含みます。さらに、string.punctuation
はすべての句読点文字を含む記号を表します。以下はその例です。
定数に加えてstring
モジュールは、文字列のプレースホルダーを置換する方法を提供するTemplateクラスも提供します。これは、特に動的な文字列を生成する際に便利です。
この例では$name
はプレースホルダーで、substitute()
メソッドを使って指定した値で置き換えられます。
Pythonでは正規表現が文字列を扱うための強力なツールとなっています。Pythonの標準ライブラリの一部であるre
モジュールは正規表現をサポートしています。
このモジュールは、検索、置換、文字列の分割など、正規表現を使って文字列を操作するための様々な関数や定数を提供します。
re
モジュールの一般的な使い方のひとつに文字列の中から特定のパターンを検索することがあります。search()
関数はマッチした場合、マッチオブジェクトを返し、マッチしなかった場合はNone
を返します。以下はその例です。
この例ではsearch()
関数を使って、文字列の中からPython
という単語を探し出しています。
re
モジュールではsub()
関数を使って文字列の一部を置き換えることもできます。この関数は検索パターンが出現するすべての文字列を新しい文字列で置き換えます。以下に、その使い方を紹介します。
この例ではsub()
関数を使用して文字列中のPython
をJava
に置き換えています。
テキストデータを扱う場合、文字列間の差分を比較・分析することがよくあります。Pythonの標準ライブラリの一部であるdifflib
モジュールがリストや文字列などの配列を比較する関数を提供しています。これらのツールは、配列間の共通要素や相違点を特定でき、difflib
はファイルの差分やパッチファイルの作成などの作業に特に有用です。
このモジュールは、配列を比較し、人間が読める差分を生成するのに役立つクラスと関数を提供します。
difflib
モジュールにはget_close_matches()
という関数があり、指定した入力文字列に近い文字列をリストで見つけることができます。以下はその例です。
この例ではget_close_matches()
関数がリストの中からcat
に似た単語を探し出します。
difflib
モジュールにはDiffer
というクラスもあり、これを使うと行ごとの違いを表示してきめ細かく配列を比較できます。ここではその使い方を紹介します。
この例では2つの文字列を比較するためにDiffer
が使用されています。出力には2つの文字列の差分が一行ずつ表示されます。
Pythonのtextwrap
モジュールは、標準ライブラリの一部で行を折り返したり埋めたりすることでテキスト出力をフォーマットする機能を提供します。幅を固定するなど、特定の方法でテキストを出力する必要がある場合に便利なユーティリティです。インデントや改行ルールなどをカスタマイズできる多くのオプションが付属しています。
textwrap
モジュールが提供する2つの主要な機能はテキストの折りたたみ(ラップ)と充填(フィリング)です。ラップは各行が最大で与えられた文字数を含むように入力段落を分割します。一方、フィリングはラップに似ていますが、行のリストの代わりに改行が埋め込まれた単一の文字列を返します。
textwrap
モジュールではテキストのインデントを調整できます。これは構造化された出力を作成したり、ぶら下がったインデントを持つテキストブロックを印刷する必要がある場合に便利です。ここではインデントを追加する方法を説明します。
今日のグローバル化したデジタル環境ではUnicodeデータを効率的に扱うことが重要です。標準ライブラリの一部であるPythonのunicodedata
モジュールは、Unicode文字データベースへのアクセスを提供することでこの実現に貢献します。Unicode文字のプロパティを取得したり、文字のカテゴリを決定したり、正規化を処理したりするのに役立ちます。
unicodedata
モジュールはUnicode文字のプロパティを取得するためのいくつかの関数を提供します。例えば、name()
関数は文字に割り当てられた名前を返し、category()
関数はその文字の一般的なカテゴリを返します。以下はその例です。
この例では文字A
の名前とカテゴリを取得しています。
Unicode正規化とはUnicode文字列を標準的な形に変換する処理で、文字列を比較するときに便利です。unicodedata
モジュールはこのためにnormalize()
関数を提供しています。以下はその例です。
この例ではnormalize()
関数がé
文字を基底文字e
とアクセントに分解しています。
コマンドラインアプリケーションで作業する場合、入力と出力の処理は使いやすさの重要な側面となります。Pythonのreadline
モジュールは標準ライブラリの一部で、行編集、履歴保存、テキスト予測などの機能を提供し、コマンドラインインターフェイスの経験を向上させます。
readline
モジュールはbashやtcshのようなシェルに見られるような行編集機能を提供します。ユーザーはカーソルを動かしたり、文字を削除したり、テキストを殺す(削除して保存し、後で貼り付ける)ことができます。ただし、このモジュールはPythonの対話型シェルのような対話型セッションで動作するものであり、通常のPythonスクリプトでその機能を示すことはありません。しかし、Pythonの対話型セッションでreadline
モジュールをインポートし、テキスト入力を試すことで、これらの機能を自分で体験できます。
readline
のもう1つの大きな特徴はコマンドの履歴を扱うことができることです。ユーザーが入力したコマンドを記録しておき、その中からナビゲートできるようにするのです。履歴から特定のコマンドを取り出すには、get_history_item()
関数を使用できます。get_current_history_length()
関数は、現在保存されているヒストリーの行数を返します。
履歴機能はスタンドアロンのスクリプトではなく、インタラクティブなPythonセッションで動作することを忘れないでください。
テキストデータを扱う場合、異なるフォーマット間でエンコードやデコードすることがよくあります。Pythonの標準ライブラリの一部であるcodecs
モジュールは、様々なコーデック(符号化器・復号器)を使ってデータをエンコード・デコードする関数を提供します。UTF-8やASCIIなどのテキストエンコーディングと、base64や16進数などのバイナリエンコーディングの両方をサポートしています。
codecs
モジュールはテキストデータを異なるエンコーディングに変換するためのencode()
とdecode()
関数を提供します。ここでは文字列をUTF-8と相互変換する例を示します。
この例ではencode()
関数は、文字列のUTF-8エンコーディングを表すバイト列であるbytesオブジェクトを返します。そして、decode()
関数はこのbytesオブジェクトを通常の文字列に変換して返します。
codecs
モジュールはbase64などのバイナリーエンコーディングもサポートしています。ここではbase64を使ったデータのエンコードとデコードの例を紹介します。
この例ではencode()
関数は、データのbase64エンコードを表すbytesオブジェクトを返します。そして、decode()
関数はこのbase64データを元の形式に変換します。
タイムゾーンの取り扱いは多くのPythonアプリケーションで共通の要件です。バージョン3.9から導入されたPythonのzoneinfo
モジュールは標準ライブラリの一部でIANAタイムゾーンのサポートを提供し、タイムゾーンの取り扱いをより簡単にしています。
特定のタイムゾーンを扱うにはそのタイムゾーン用のZoneInfo
オブジェクトを作成する必要があります。このオブジェクトをdatetime
のastimezone()
関数で使用すると、datetime
オブジェクトを目的のタイムゾーンに変換できます。
Pythonのcalendar
モジュールは、カレンダーに関連する出力を処理するための幅広い機能を提供します。カレンダーの印刷から、ある年がうるう年かどうかの検索まで、Pythonのcalendar
モジュールはそれをカバーしています。Pythonで日付や時刻のデータを扱う際には必須のライブラリです。
calendar
モジュールでは指定された月や年のテキストカレンダーを作成できます。以下は、2023年5月のテキストカレンダーを印刷する例です。
さらにisleap()
関数である年がうるう年かどうかを確認できます。
calendar
モジュールを使えば特定の日付の曜日を調べることもできます。Pythonは月曜日を0、日曜日を6として表現します。weekday()
関数は、与えられた年、月、日の曜日を返します。
Pythonのcopy
モジュールは、リストや辞書のような複雑なオブジェクトのコピーを作成する必要がある場合に、同じオブジェクトへの参照ではなく必須のユーティリティとなります。初心者にありがちな罠は、複雑なオブジェクトがミュータブルであることで代入演算子を使ってコピーしたときに予期せぬ動作をすることです。
copy
モジュールがサポートするコピーにはシャローコピーとディープコピーの2種類があります。シャローコピーは、新しい複合オブジェクトを構築し、その中にオリジナルで見つかったオブジェクトへの参照を挿入します。一方、ディープコピーは、新しい複合オブジェクトを構築し、そこへ再帰的にオリジナルのオブジェクトをコピーし挿入するものです。
これをリストで説明しましょう。
この例では、オリジナルのサブリストの変更はshallow_copy
には反映されるがdeep_copy
には反映されません。
ご覧のように、元のリストにも変更が反映されています。しかし、deep_copy
に同じ変更を加えても元のリストは変わりません。
Pythonのcollections
モジュールはPythonの組み込みデータ構造を超える追加のデータ型を提供する強力なライブラリです。このモジュールは、機能を強化しPythonコードの効率を向上させます。defaultdict
、namedtuple
、deque
、Counter
、OrderedDict
などの便利なデータ構造が含まれています。
まず、collections
モジュールにある2つの人気クラス、defaultdict
とCounter
を調べてみましょう。
defaultdict
は通常のPython辞書とほぼ同じように動作しますが、存在しないキーにアクセスしようとしてもKeyErrorを発生させません。その代わりにデフォルトの値で初期化されます。
一方、Counter
はハッシュ可能なオブジェクトをカウントするためのdict
サブクラスです。これは要素が辞書のキーとして格納され、そのカウントが辞書の値として格納されるコレクションです。
namedtuple
は名前付きフィールドを持つtuple
のサブクラスを生成します。より意味のあるコンテキストを提供することでコードをすっきりさせ読みやすくする簡単な方法です。
deque
(ダブルエンド・キュー)はスタックとキューを一般化したものです。スレッドセーフでメモリ効率の良い追加と削除が可能で、どちらの側からもほぼ同じO(1)の性能が得られます。
Pythonのpprint
モジュールは、Pythonのデータ構造を整形して読みやすく表示する機能を提供します。特にネストしたリストや辞書など、従来のprint関数ではうまく表示できないような複雑なデータを扱う場合に便利です。
伝統的に表示すると読みづらい入れ子の辞書の例について考えてみましょう。
このコードでは辞書が1行で表示されるため、可読性が落ちます。では、pprint
を使ってみましょう。
pprint関数は、キーと値のペアがそれぞれ改行された、より構造化された形式で辞書を出力するのでより読みやすくなります。
pprint
モジュールのもう1つの特徴は出力の幅を制御できることです。これはpprint
関数にwidth
パラメータを渡すことで実現できます。
この例ではwidth=1
によって、リストや辞書の各項目が別々の行へ印刷されるようになります。これは長いリストや辞書の場合に便利です。
Pythonのenum
モジュールは、値の集合を表す記号的な名前である列挙を作成できます。列挙型は反復可能で不変であり、一度作成された個々の値を変更は不可能です。列挙型は、特定の値から1つを選ぶことができるもので、コードの可読性を高めるために使用されます。
列挙型は、enum
モジュールを使って次のように作成します。
上記の例ではColorは3つのメンバーを持つ列挙型(またはEnum
)です。 Color.RED
、Color.GREEN
、Color.BLUE
です。これらのメンバーはそれぞれ1、2、3の値を持っています。以下に、それらの使い方を説明します。
ご覧のように列挙型は単純な定数よりも読みやすくなっています。また、名前('RED'など)と値(1など)をすばやく関連付けることができます。
列挙型には読みやすさ以外にもいくつかの利点があります。列挙型は反復可能であるため、ループ処理を行うことができます。また、列挙型の値が有効な値の1つであることが保証されるのでバグを防ぐことができます。
Pythonのrandom
モジュールは、ゲーム開発、データ解析、暗号化など、プログラミングの様々な分野で重要な役割を果たす乱数を生成できます。ランダムモジュールは、さまざまな確率分布から乱数を生成するための関数群を提供します。
Pythonでは、randomモジュールが提供するいくつかの関数を使って乱数を生成できます。そのうちのいくつかを見てみましょう。
これらの例ではrandom()
は0から1の間のランダムな浮動小数点を生成しています。randint(a, b)
はa
からb
(包括)の間のランダムな整数を生成し、choice(list)
は与えられたリストの中からランダムに要素を選び出します。
random
モジュールのその他の機能random
モジュールには単純な乱数生成だけでなく、リストをランダムにシャッフルしたり、ガウス分布や指数分布などの異なる分布から乱数を生成したり、ランダムビットを生成する関数もあります。
続きは下記リンクからご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その2