「あれどうやるんだっけ・・・」を解決できるPython標準ライブラリ3選!

2024.02.16

2024.02.16

Fabeee社員ブログ

「あれどうやるんだっけ・・・」を解決できるPython標準ライブラリ3選!

こんにちは、バックエンドエンジニアのワカと申します!
今回はPythonで使うことのできる標準ライブラリの紹介をしようと思います。

自分はFabeeeに入社してから本格的にPythonを使い始め(前職はPHPで開発してました)、その中で「Pythonの標準ライブラリって意外と便利!できることが広い!」と思うことが多かったので、用法と共にいくつかご紹介します!

標準ライブラリとはPythonが標準装備しているモジュールの集合であり、主に「import モジュール名」で呼び出して使用できるものになります。(一部importの記述が必要ない直接実行できる組み込み関数も含みます、例:open(), enumurate()等)
参考:Python公式-標準ライブラリ

対して外部モジュールはpipやpoetryなどのパッケージマネージャを介してインストールするもので、フレームワークから言語処理などさまざまなジャンルのモジュールが存在します。PyPI(Python Package Index )で一覧を見ることができます。

pathlibモジュール

pathlibモジュールを使うとファイルやディレクトリをオブジェクトにして操作することができます。
pathlib.Path()でPathオブジェクトを生成できて、引数としてパスの文字列を指定できます。
引数を省略するとカレントディレクトリ、現在の作業ディレクトリの相対パスとなります。

import pathlib

pa = pathlib.Path("tmp/fabeee.txt")
print(pa)
# tmp/fabeee.txt

current = pathlib.Path()
print(current)
# .

生成したPathオブジェクトのメソッドや属性によって様々な処理ができます。

 

import pathlib
pa = pathlib.Path("tmp/fabeee.txt")
 

#実際に存在するパスか
pa.is.exist()

# 指定パスで新規ファイル作成
pa.touch()

# ファイルかどうか判定
pa.is_file()

# ディレクトリか判定
pa.is_dir()

# ファイル名を取得する
pa.name # fabeee.txt

# ファイル名から拡張子を取得する
pa.suffix # .txt

# ファイルの削除
pa.unlink()

calendarモジュール

calenderモジュールでは一般的なカレンダーを年間・月刊で取得したり、さらにプレーンテキストやHTMLなど様々な方式で取得できます。
calendar.month()で月を指定、calendar.calendar()で年を指定して年間をstrで取得できます。

import calendar
print (calendar.month(2024, 2))

# Mo Tu We Th Fr Sa Su
# 1 2 3 4
# 5 6 7 8 9 10 11
# 12 13 14 15 16 17 18
# 19 20 21 22 23 24 25
# 26 27 28 29

print(calender.calender(2025))

# 2025
# January February March
# Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
# 1 2 3 4 5 1 2 1 2
# 6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
# 13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
# 20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
# 27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
# 31 ....(以下12月まで続く)

HTML形式ではHTMLCaldendarオブジェクトを一回作成して、formatmonthで月を指定(formatyearで同様に年指定可)することでtableで取得することができます。

html_cal = calendar.HTMLCalendar()
print(html_cal.formatmonth(2024, 2))

#

### ...
##
<table class="month" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th class="month" colspan="7">February 2024</th>
</tr>
<tr>
<th class="mon">Mon</th>
<th class="tue">Tue</th>
<th class="wed">Wed</th>
<th class="thu">Thu</th>
<th class="fri">Fri</th>
<th class="sat">Sat</th>
<th class="sun">Sun</th>
</tr>
<tr>
<td class="mon">26</td>
<td class="tue">27</td>
<td class="wed">28</td>
<td class="thu">29</td>
<td class="noday"></td>
<td class="noday"></td>
<td class="noday"></td>
</tr>
</tbody>
</table>
# table内のcss classも新たに代入することで設定可能
print(html_cal.cssclasses)
# ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']

html_cal.cssclasses = ["mon normal"... "sat blue", "sun red"]
 calendar.Calendarオブジェクトからはmonthdayscalendarを使うことで7日ごとの2次元リストを取得することもできます。 存在しない日は0で表現されていて、同様にyeardayscalendarで年指定も可能です。 その他monthdatescalendarでdatetime.dateオブジェクトの形式で取得することも可能です。
cal = calendar.Calendar()
print(cal.monthdayscalendar(2024,2))

# [[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [....
# [26, 27, 28, 29, 0, 0, 0]

print(cal.monthdatescalendar(2024,1))

# [[datetime.date(2024, 1, 1), datetime.date(2024, 1, 2), datetime.date(2024, 1, 3)...

collectionsモジュール

collectionsモジュールはリストやタプル、辞書などを拡張した形式で使用することができます。
個人的に自分が一番使えそう(だけど使いこなすのは難しそう・・・)と感じるライブラリ群です。おそらく競プロとかの分野でとても使いやすいのではと思っています。

Counter

まずcollections.Counterクラスではリスト、タプルを渡してCounterオブジェクトを作成することで、出現回数と要素をセットで取得することができます。

import collections

fab = ["f", "a", "b", "e", "e", "e", "!"]
co = collections.Counter(fab)

print(co)
# Counter({'e': 3, 'f': 1, 'a': 1, 'b': 1, '!': 1})

要素をキーをとして指定可能で、存在しないキーの場合は0を返してくれます。

print(co["f"]) #1
print(co["?"]) #0

その他most_commonで出現回数が多い順にタプルにして取得できたり、渡す引数として文字列もシーケンス型として渡すことが可能です。

phy = "Raise_the_world's_heart_rate"
co = collections.Counter(phy)
print(co.most_common())

# [('e', 4), ('_', 4), ('a', 3), ....('l', 1), ('d', 1), ("'", 1)]

deque

dequeクラスはスタックやキューとして利用することが可能で、listなどと比較して両端の要素への処理速度が速く効率的に扱えます。
collectionモジュールからインポートして使用することができ、リストなどのイテラブルオブジェクトを引数にしてdequeオブジェクトを作成できます。(空作成でも可能)

from collections import deque

de = deque([1, 2])
print(de)
# deque([1, 2])

append()で末尾(右)、appendleft()で先頭(左)に要素を追加することができます。
リストなどで複数追加する場合はextend(), extendleft()がそれぞれ使用できます。

de.append(3)

de.appendleft(0)

print(de)
# deque([0, 1, 2, 3])

de.extend([4, 5])

de.extendleft([-1, -2])

print(de)
# deque([-2, -1, 0, 1, 2, 3, 4, 5])

加えてpop()で末尾要素の削除と取得、同様にpopleft()で先頭を指定できます。
dequeが空の場合はエラーになるので注意。

print(de.pop())
# 5

print(de.popleft())
# -2

print(de)
# deque([-1, 0, 1, 2, 3, 4])

dequeの大きな特徴としてコンストラクタでmaxlenが指定できます(デフォルト値はNoneのため制限なし)。指定した最大長を超える要素が追加された場合、逆側の要素が自動的に削除されるようになっています。

ma = deque([1, 2, 3],maxlen=4)
print(ma)
# deque([1, 2, 3], maxlen=4)

ma.extend([4,5])
print(ma)
# deque([2, 3, 4, 5], maxlen=4)

データを先入れ先出しの構造で表現するキュー(Queue)として使用する際はデータ格納(enqueue)の際にappend(), データ取り出し(dequeue)の際にはpopleft()を使うことができます。

que = deque(["a","b","c"])

que.append("d")
print(que) # deque(["a","b","c","d"])

# キューからタスクを取り出す
task = que.popleft()
print(task) # "a"

#aを実行するなどする・・・・

#キューに残ったタスク
print(que) # deque([b","c","d"])

対してデータを後入れ先出しの構造のスタックとして利用する際は、データ格納には同様にappend(), データ取り出しにpop()を使うことで表現できます。

stack = deque(["a","b","c"])

stack.append("d")
print(stack) # deque(["a","b","c","d"])

# スタックから取り出す
dish = stack.pop()
print(dish) # d

# dの処理・・・

終わりに

いくつかPythonの標準モジュールの便利な用例を紹介させていただきました。
Pythonならちょっと込み入った処理でも簡単にこなすことができるので、ぜひ参考にしてみてください!

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。