これは、筆者の「2025振り返り用ひとりアドカレ」記事の一つです。
はじめに
本記事は普段 React, Next.jsなどを使う筆者が2025年に業務効率化を絶対目標としてPython学習したことに際し、「フロントエンド側の人間が 1からPythonを学んでみて」というテーマで書いていくシリーズ記事の一つです。
対象読者
- 業務効率化を願うビジネスパーソン
- バックエンド側に興味があるフロントエンド側の方々
- バックエンド側とフロントエンド側の言語における違いや共通性が知りたい方々
- Pythonを学び始めた方々
- Pythonを学ぼうとしているフロントエンドエンジニアの方々
わざわざ学ばなくても、AI(LLM)に任せれば良くね?
筆者がPython学習のモチベーションとしたのは「業務効率化を絶対目標」とすることです。
正直これはAIで簡単に行える世界になりつつありますが、筆者はAIの成果物を正しく活用するにはチェックできるだけの基礎力が大事だと思っています。
そのため遠回りに見えつつもPythonを体系的にじっくり学んでいくルートを選びました。
ライブラリ
Pythonのライブラリはモジュールとパッケージという構成です。
便利なライブラリを知る前に Python におけるライブラリの基礎知識を学んでいきましょう。
モジュール
特定機能を持ったプログラムの構成部品(Pythonファイル名.py)
パッケージ
複数のモジュールをひとまとめにしたもの(モジュールの詰め合わせ)
モジュール化(ロジックの再利用)
モジュール化は必須でないものの、これを行うことで再利用性が高まり、保守・管理もしやすくなります。
また、他のプロジェクトにも流用できることで汎用性と生産性も向上できるでしょう。
単独実行または他プログラムからも利用可能なモジュールの作り方
1. はじめに、モジュールの主要な処理を関数にまとめる
def 関数名(引数, ...):
# 処理の記述...
2. モジュールを単独で(Pythonコマンドで)実行したときに関数を呼び出す処理を追加
if __name__ == "__main__":
関数名(引数, ...)
-
__name__
モジュール名を返す特別な変数です。-
モジュールを単独実行するとき
モジュール名は"__main__"となる -
他プログラムから利用するとき
モジュール名は(当該モジュール)ファイル名となる(※.py拡張子は省く)
-
モジュールを単独実行するとき
if __name__ == "__main__":
モジュール作成において上記記述が必要な理由は __name__が"__main__"に等しいかどうかをチェックし、「等しい場合はモジュールの主要な処理を行う関数を呼び出せる」ようにするため であり、これにより単独でも他プログラムからでも使用できるようになるのです。
パッケージの階層構造
パッケージは、パッケージ/サブパッケージ/サブサブパッケージ/モジュールというような階層構造になっており、.記法で選択していきます。
JavaScript でいうとオブジェクトのプロパティやメソッドチェーンのようなイメージですね。
モジュール名の書き方(パッケージなし)
モジュール名
モジュール名の書き方(パッケージあり)
パッケージ.モジュール名
モジュール名の書き方(サブパッケージあり)
パッケージ.サブパッケージ.〜サブサブ…〜.モジュール名
ここまでが基礎的な部分です。
以降は実際にライブラリを使用するための前準備(インポート)について説明していきます。
ライブラリの使用方法
他の言語やライブラリ、フレームワークと同じように使用したい機能(モジュール / パッケージ)をインポートする。
import モジュール名
- 具体例:標準ライブラリ
randomモジュールを使用
Python のrandomモジュールは疑似乱数(疑似的なランダム数値)を生成する機能を持っていますが、JavaScript のMath.random()同様、疑似乱数は暗号に使用可能な安全性を備えていないのでセキュリティ事案に使用してはいけません。
import random
# random ライブラリを使用(1から6までの乱数を生成)
print(random.randint(1, 6))
モジュールに別名を付けたり、省いたりして利用する
モジュール名やインポートした機能に別名を付けたり、一部を省いて簡略化した記述で呼び出したりできます。
モジュール名に別名を付けて使用する
# import モジュール名 as 別名
import random as r
r.randint(1, 6)
モジュール名を省いて(希望する機能を)使用する
# from モジュール名 import 機能名, ...
from random import randint
randint(1, 6)
全ての機能をモジュール名を省いて使用する
# from モジュール名 import *
from random import *
インポートした機能に別名を付けて使用する
# from モジュール名 import 機能名 as 別名
from random import randint as ri
ri(1, 6)
パッケージ名を省いてモジュールを使用
※例として、URL文字列を解析して各種の要素を抽出するurllibライブラリを使用
# from パッケージ名 import モジュール名
from urllib import parse
url_parse_result = parse.urlparse("https://example.com/hoge/foo")
print(url_parse_result)
パッケージ名とモジュール名を省いて機能を使用
※例として、URL文字列を解析して各種の要素を抽出するurllibライブラリを使用
# from パッケージ名.モジュール名 import 機能名
from urllib.parse import urlparse
url_parse_result = urlparse("https://example.com/hoge/foo")
print(url_parse_result)
先ほどのurllibライブラリを使用したコード例で、パッケージとモジュールをそれぞれインポートする記述例
# パッケージとモジュールをそれぞれインポート
import urllib
import urllib.parse
url_parse_result = urllib.parse.urlparse("https://example.com/hoge/foo")
print(url_parse_result)
# ParseResult(scheme='https', netloc='example.com', path='/hoge/foo', params='', query='', fragment='')
Python標準ライブラリをいくつか紹介
筆者の独断と偏見で選んだパッケージであり、関連モジュールも全てを網羅してはいません。これを知っておくと便利という観点で選抜しています。
random
文字列や数値を対象に、様々なランダム処理を持ったライブラリ。
-
choice関数
第一引数に渡したシーケンス(※リストなどインデックス番号で要素を指定できるデータ構造)内の要素をランダムで取得(抽出)
import random
target_list = ["Morning", "Afternoon", "Evening", "Night"]
random.choice(target_list)
-
shuffle関数
第一引数に渡したシーケンス内の要素順序を(ランダム)シャッフルする
import random
target_list = ["Morning", "Afternoon", "Evening", "Night"]
random.shuffle(target_list)
time
時刻の取得や変換を行うモジュール。現在時刻(エポックからの経過秒数)をfloat(浮動小数点数)で返す。
※エポック(UNIXエポック)とは大抵のシステムにおいて「1970年 1月 1日 0時 0分 0秒」を指す。
-
time関数
現在時刻(エポックからの経過秒数)を返す
import time
print(time.time())
-
gmtime関数
UTCにおける現在時刻を取得できる
import time
print(time.gmtime())
-
localtime関数
使用している環境(地域)の設定に基づいた現在時刻を取得できる
import time
local_time = time.localtime()
print(local_time)
print(f"{local_time.tm_year}年{local_time.tm_mon}月{local_time.tm_mday}日 {local_time.tm_hour}時{local_time.tm_min}分{local_time.tm_sec}秒")
-
sleep関数
指定した秒数だけプログラム実行を停止する
import time
# 3秒後にこれ以降に続く処理を実行
time.sleep(3)
urllib
webページを取得できる標準ライブラリ。
from urllib.request import urlopen
# with 文を使用することで対象要素の「開く」と「閉じる」を自動的に処理し、
# 対象要素の「閉じ忘れ」を防止
with urlopen("https://example.co.jp/") as sitedate:
for content in sitedate:
# このままではバイト列で表示される
# print(content)
# str でバイト列を utf-8 文字列に変換
print(str(content, encoding="utf-8"), end="")
Python ではデータベースをわざわざ用意しなくても SQLite が使える
sqlite3
データベースをわざわざ用意する必要なく、RDBMS(リレーショナルデータベース・マネジメント・システム)の一種であるSQLiteを利用できる標準ライブラリ。
処理を実行する上ではSQL文の知識が必要です
-
connect()関数
データベースに接続し、接続を意味するconnectionオブジェクトを返す
connection = sqlite3.connect("データベース名.db")
-
cursor()メソッド
connectionオブジェクトを通じて、データベース操作関連の機能を提供するカーソルオブジェクト(イテラブル)を取得する。
cursor_obj = connection.cursor()
-
execute()メソッド
RDBMS(本事例ではSQLite)に対してSQL文を適用(発行・実行)する。SQL文の中でシングルクォートを使う場合があるので、引数に指定する文字列はダブルクォートで記述するのが無難。
cursor.execute("SQL文")
-
executemanyメソッド
イテラブルに対してSQL文を繰り返し適用(発行・実行)する。
cursor_obj.executemany("SQL文", イテラブル)
- SQL文の
?
execute()やexecutemanyメソッドにおいて、SQL文の中に?を書いておくと、その位置に値を埋め込むことができる。
# テーブルに行(値?, 値?)を追加
cursor_obj.executemany("INSERT INTO テーブル VALUES (?, ?)", イテラブル)
-
commit()メソッド
(データベースを変更するSQL文を実行した際などに)connectionオブジェクトを通じて、データベースの更新処理を行う。
connection.commit()
-
close()メソッド
(connectionオブジェクトを通じて)データベースへの接続を閉じる(終了する)ためのメソッド。
connection.close()
Python非標準ライブラリをいくつか紹介
フロントエンドで親しみ深いnpmと同じ要領でライブラリをインストールして使用します。
Pythonでnpmにあたるコマンドはpip(Windows) / pip3(Mac | Linux)です。
※一般的にはバージョン管理ツールや仮想環境下でインストールしていきます。
Pythonでは「仮想環境を使わない場合、pip install パッケージ / モジュール名はグローバル環境にインストールするという仕様」です。
フロントエンド開発でもそうですが、何でもかんでもnpmなどをグローバルインストールしていたらverの競合が起きたり、PCのパフォーマンスに影響が出たりします。
そのため、特定のプロジェクトでは専用または特化した環境を用意するのが一般的です。
※実際に使ってみて便利だったもの、汎用性の高いものには★マークを付けています(もちろん筆者の独断と偏見です)
NumPy(ナムパイ)
数値計算でよく使われるライブラリ。
主要な機能は、数値を格納するための配列と、配列に対する各種の演算です。
この配列はベクトルや行列として使用したり、CSVファイルから読み込んだ数値を格納したり、各種の統計量を求めたりもできる。他のライブラリ(PandasやMatplotlibなど)でも使用されています。
pip install numpy
Pandas(パンダス)
データ処理でよく使われるライブラリ。
データの読込、指定したデータの取得、統計量の計算などを簡単なプログラムで実現できます。
pip install pandas
Pandasにはデータフレームという独自のオブジェクトがあるので、分かりやすくデータを表示したり、扱ったりしたい場合はNumPyよりPandasのほうが良いです。
Matplotlib(マットプロットリブ)
インフォグラフィック(可視化) ライブラリ。
NumPyの配列やPandasのデータフレームなどから色々な種類の図を作成できます。
データの分析やクラスタリングなどのAIの手法を適用する際に相乗効果を発揮する可視化処理を行ってくれます。
- クラスタリング
入力データをいくつかのクラスターに分類すること
インフォグラフィックの利点としては数値(データ)が視覚化されることで、より適切な仮説出しができたり、施策の効果検証を行ったりしやすくなるところです。
pip install matplotlib
個人的に データからのインフォグラフィック生成は、AIに処理対象データを渡して自然言語で実施させたほうが速くて楽 だと思います。
※ただし、使用するAIによって(※特に無料プランの場合)は機密情報を渡さないよう注意が必要です。
scikit-learn(サイキットラーン)
機械学習ライブラリ。
データに対して、分類、回帰、クラスタリング、次元削減といった機械学習に関する色々な手法を適用することができます。
pip install scikit-learn
★ Pillow(ピロー)
画像ファイルの入出力や編集でよく使われるライブラリ。
筆者が使用した場面では、AIと組み合わせて画像からテキスト抽出または読み込み、別ライブラリ(pdf2image, pypdfなど)と組み合わせてPDFからの画像生成など汎用性が高かったです。
例えば、矩形(くけい)や円といった図形をはじめ、画像の色数やサイズの変更も行えます。
pip install Pillow
# ライブラリ名は`Pillow`だがインストール後のパッケージ名は`PIL`となる
pypdf
PDFファイルを扱う時に利用するライブラリ。
pip install pypdf
PDFファイルを画像(JPG)に変換したい場合
Poppler(PDF -> 画像変換)
PDFファイルを画像(JPG)へ変換するためにpdf2imageという非標準ライブラリと、それと併用するPopplerというC++製の外部ツールがあります。
Popplerのインストールが必要なので、利用OS別に以下の手順でPopplerをインストールしてください。
-
注意
Popplerがインストールされていない場合、PDFから画像への変換処理が正常に動作しません。必ず事前にインストールしてください
macOSの場合
brew install poppler
Windowsの場合
-
Poppler for Windows (GitHub Releases) からPopplerの最新zipファイルをダウンロードします。
-
Release-xx.xx.x-x.zipなど最新のzipファイルを選択してください。
-
- ダウンロードしたzipを解凍し、
binフォルダのパスを環境変数PATHに追加してください。
Windowsで「binフォルダのパスを環境変数PATHに追加」する手順
-
スタートメニューを右クリックし、システムを選択します。 -
システムの詳細設定をクリックします。 -
環境変数ボタンをクリックします。 -
システム環境変数のPathを選択し、編集をクリックします。 -
新規をクリックし、C:\path\to\poppler\bin(実際のパスに置き換えてください | 例:C:\poppler-24.08.0\Library\bin)を追加します。 -
OKをクリックして全てのダイアログを閉じます。
Linuxの場合(Ubuntu系)
sudo apt-get install poppler-utils
★ openpyxl(オープンパイエックスエル)
Excelファイルを扱う時に利用するライブラリの一つ。
pip install openpyxl
個人的にmatplotlib(インフォグラフィック生成ライブラリ)同様、 エクセルやスプレッドシートの生成・加工などは、AIに自然言語で実施させたほうが速くて楽 だと思います。
ただし、処理を微調整したい際になど当該ライブラリの知識を持っておくと適切なプロンプトを作れる確率が高まると思います。
★ Requests(リクエスツ)
webスクレイピング(webアクセス)用のライブラリ。
標準ライブラリurllibよりも簡潔なプログラミングで手軽にWebを扱えます。
pip install requests
-
webスクレイピングについて
webスクレイピングは、受けるサイトの負荷が大きく(程度によっては)犯罪にもなり得る危険な行為なので、第三者のサイトや自身と関係のサイトへ行うのは控えるべき。
★ BeautifulSoup
HTMLファイル構造を解析して必要なデータを抽出するためのライブラリ。
要素の階層構造に基づいた処理が可能なので文字列のパターンマッチ(正規表現)よりも確実かつ容易にデータを取り出せる(可能性がある)
pip install beautifulsoup4
スープ = BeautifulSoup(HTMLの文字列, 'html.parser')
Requests と BeautifulSoup を使った事例
res = requests.get("取得したいサイトURL文字列")
res.encoding = res.apparent_encoding # エンコーディング処理
# BeautifulSoup で、取得したwebページの各コンテンツ(res.text)をHTML解析
soup = BeautifulSoup(res.text, "html.parser")
- 実装例
# find メソッド: 該当する最初の要素を返す(存在しなければ None)
スープ.find(要素名)
# スープ.find("a")
スープ.find(要素名, 属性名=値, ...) # 属性名はオプショナル
# class 属性を指定する場合は Python の class と競合するため class_ と記述(指定)する
# スープ.find("span", class_="release-number")
# find_all メソッド: 該当する全ての要素を返す(存在しなければ None)
# 返り値はイテラブルなのでループ処理可能
スープ.find_all(要素名)
# スープ.find_all("li")
スープ.find_all(要素名, 属性名=値, ...) # 属性名はオプショナル
上記html.parserとは、 Python 標準の HTML用パーサー(構文解析器)のことで、サードパーティ制のHTMLパーサーを利用(指定)することも可能です。
使用するパーサーによって、HTMLの記述に対する柔軟性や処理の速度が異なります。
schedule
あらかじめ設定したスケジュールに基づいて、指定した処理(関数)を定期的に実行する非標準ライブラリ。
pip install schedule
schedule 実装例一覧表
hoursやminutesといった複数形の部分はhour,minuteなど単数形でも問題ありません。
基本的な間隔設定
-
.seconds:schedule.every(10).seconds.do(関数)……… 10秒ごとに実行 -
.minutes:schedule.every(30).minutes.do(関数)……… 30分ごとに実行 -
.hours:schedule.every(2).hours.do(関数)……… 2時間ごとに実行 -
.days:schedule.every(3).days.do(関数)……… 3日ごとに実行 -
.weeks:schedule.every(2).weeks.do(関数)……… 2週間ごとに実行
特定時刻の設定
-
.at():schedule.every().day.at("10:30").do(関数)……… 毎日10:30に実行 -
.hour.at():schedule.every().hour.at(":00").do(関数)……… 毎時00分に実行
曜日指定
-
.monday:schedule.every().monday.do(関数)……… 毎週月曜に実行 -
.tuesday:schedule.every().tuesday.do(関数)……… 毎週火曜に実行 -
.wednesday:schedule.every().wednesday.at("13:15").do(関数)……… 毎週水曜13:15に実行 -
.thursday:schedule.every().thursday.do(関数)……… 毎週木曜に実行 -
.friday:schedule.every().friday.do(関数)……… 毎週金曜に実行 -
.saturday:schedule.every().saturday.do(関数)……… 毎週土曜に実行 -
.sunday:schedule.every().sunday.do(関数)……… 毎週日曜に実行
タグ付け管理
-
.tag():schedule.every().day.do(関数).tag('daily')……… タグ付けしてジョブを管理 -
.clear():schedule.clear('daily')……… 特定タグのジョブをキャンセル
引数付き関数
-
.do():schedule.every().day.do(greet, name="Alice")……… 関数に引数を渡して実行
条件付き実行
-
CancelJob:return schedule.CancelJob……… 条件に応じて実行を停止
run_pending関数
所定のタイミングになったスケジュール(に登録した)関数を実行する
# 1行ごとにスケジュールを(延々と)実行
while True: # 無限ループ
schedule.run_pending() # スケジュール(指定した定期的な処理)を実行
time.sleep(1) # 1秒後に処理実行
さいごに
本記事ではPythonにおける便利なライブラリを紹介してきました。
そして本記事が「フロントエンド側の人間が 1からPythonを学んでみて」というテーマで書いていくシリーズ記事の最後です。
本年(2025年)筆者が Python を学んだのは冒頭にも書いた通り「業務効率化を絶対目標」としたためです。
実際、Python を体系的に学んできたお陰でAIを活用する上でもスムーズなプロンプトを生成できて作業効率が向上しました。
※あまり慣れていない言語やライブラリ、フレームワークをAIを使って実装していく場合は、こちらもAIを活用して振り返りすることを推奨します。これによってより身につきやすくなったと筆者は実感しています
本年は Python による業務効率化(一部自動化)ツールを作成したお陰で、筆者が求めていたイレギュラー対応を加味したバッファ駆動なスケジュール進行──つまり、余剰時間・余裕(バッファ)を作ることを目的にした働き方が少しは実現できました!
昨今、ノーコードでも作業ツールを簡単に作れますが、その反面として特化した処理の実装はどうしても難しい印象があります。
そこで柔軟性を求めてAIを活用しても、基礎知識がないと何が正しくて、何が間違っていて、どう指示すれば良いのかすら判断できないでしょう。
基礎的な言語学習は面白くないし、面倒くさい部分もありますが、結局地道に基礎力を高めていくのが一番の近道なのだと思います。
ここまで読んでいただき、ありがとうございました。