Python必須ライブラリ完全攻略【用途別・厳選100選まとめ】
Python の最大の魅力の一つは、豊富なライブラリエコシステムです。標準ライブラリから サードパーティまで、数十万のライブラリが開発を効率化します。本記事では、用途別に厳選したPythonライブラリを実用的なサンプルコードとともに徹底解説します。
Pythonライブラリの分類
ライブラリの種類
- 標準ライブラリ: Python に標準搭載
- サードパーティライブラリ: pip でインストール
- 自作ライブラリ: プロジェクト固有のモジュール
インストール方法
# 基本的なインストール
pip install numpy pandas matplotlib
# 特定バージョンの指定
pip install django==4.2.7
# requirements.txt からの一括インストール
pip install -r requirements.txt
データサイエンス・数値計算
NumPy – 数値計算の基盤
import numpy as np
# 配列の作成と基本操作
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2], [3, 4]])
# 統計計算
print(f"平均: {np.mean(arr)}")
print(f"標準偏差: {np.std(arr)}")
print(f"行列積: {matrix @ matrix}")
pandas – データ分析
import pandas as pd
# データフレームの作成
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'salary': [50000, 60000, 70000]
})
# データ分析
print(df.describe()) # 基本統計
print(df[df['age'] > 25]) # 条件フィルタ
print(df.groupby('age')['salary'].mean()) # グループ化
SciPy – 科学計算
from scipy import stats, optimize
import numpy as np
# 統計検定
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(0.5, 1, 100)
t_stat, p_value = stats.ttest_ind(data1, data2)
print(f"t検定結果: t={t_stat:.3f}, p={p_value:.3f}")
# 最適化
def objective(x):
return x**2 + 2*x + 1
result = optimize.minimize(objective, x0=0)
print(f"最小値: {result.x[0]:.3f}")
データ可視化
Matplotlib – 基本的なグラフ作成
import matplotlib.pyplot as plt
import numpy as np
# 基本的な折れ線グラフ
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('サイン波')
plt.legend()
plt.grid(True)
plt.show()
Seaborn – 統計的可視化
import seaborn as sns
import pandas as pd
# サンプルデータ
df = pd.DataFrame({
'x': np.random.randn(100),
'y': np.random.randn(100),
'category': np.random.choice(['A', 'B', 'C'], 100)
})
# 散布図
sns.scatterplot(data=df, x='x', y='y', hue='category')
plt.title('カテゴリ別散布図')
plt.show()
Plotly – インタラクティブなグラフ
import plotly.graph_objects as go
import plotly.express as px
# インタラクティブな散布図
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length",
color="species", hover_data=['petal_width'])
fig.show()
# 3Dプロット
fig = go.Figure(data=go.Scatter3d(
x=[1, 2, 3, 4],
y=[10, 11, 12, 13],
z=[2, 3, 4, 5],
mode='markers'
))
fig.show()
機械学習・AI
scikit-learn – 機械学習
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# データ読み込み
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3, random_state=42
)
# モデル訓練
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train, y_train)
# 予測と評価
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"精度: {accuracy:.3f}")
TensorFlow/Keras – ディープラーニング
import tensorflow as tf
from tensorflow import keras
# シンプルなニューラルネットワーク
model = keras.Sequential([
keras.layers.Dense(128, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# モデル構造の表示
model.summary()
OpenCV – コンピュータビジョン
import cv2
import numpy as np
# 画像読み込みと基本操作
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# エッジ検出
edges = cv2.Canny(gray, 100, 200)
# 顔検出
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('Faces', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Web開発
Flask – 軽量Webフレームワーク
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return '<h1>Flask アプリケーション</h1>'
@app.route('/api/users/<int:user_id>')
def get_user(user_id):
user = {'id': user_id, 'name': f'User {user_id}'}
return jsonify(user)
@app.route('/form', methods=['GET', 'POST'])
def form():
if request.method == 'POST':
name = request.form['name']
return f'<h1>Hello, {name}!</h1>'
return '<form method="post"><input name="name"><button>送信</button></form>'
if __name__ == '__main__':
app.run(debug=True)
Django – 高機能Webフレームワーク
# settings.py の基本設定
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'myapp',
]
# models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all()
return render(request, 'posts.html', {'posts': posts})
FastAPI – 高速APIフレームワーク
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
@app.post("/items/")
def create_item(item: Item):
return {"message": f"Item {item.name} created"}
# 実行: uvicorn main:app --reload
HTTP・API通信
requests – HTTP通信
import requests
import json
# GET リクエスト
response = requests.get('https://api.github.com/users/octocat')
user_data = response.json()
print(f"ユーザー名: {user_data['name']}")
# POST リクエスト
data = {'key': 'value', 'name': 'test'}
response = requests.post('https://httpbin.org/post', json=data)
print(f"ステータス: {response.status_code}")
# セッションの使用
with requests.Session() as session:
session.headers.update({'User-Agent': 'MyApp/1.0'})
response = session.get('https://httpbin.org/headers')
print(response.json())
urllib3 – 低レベルHTTP
import urllib3
http = urllib3.PoolManager()
# 基本的なGETリクエスト
response = http.request('GET', 'https://httpbin.org/get')
print(response.status)
print(response.data.decode('utf-8'))
# ヘッダー付きリクエスト
response = http.request(
'POST',
'https://httpbin.org/post',
body=json.dumps({'key': 'value'}),
headers={'Content-Type': 'application/json'}
)
print(json.loads(response.data.decode('utf-8')))
データベース
SQLAlchemy – ORM
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(100))
# データベース接続
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# データ操作
new_user = User(name='Alice', email='alice@example.com')
session.add(new_user)
session.commit()
users = session.query(User).all()
for user in users:
print(f"{user.name}: {user.email}")
psycopg2 – PostgreSQL
import psycopg2
from psycopg2.extras import RealDictCursor
# データベース接続
conn = psycopg2.connect(
host='localhost',
database='mydb',
user='user',
password='password'
)
# クエリ実行
with conn.cursor(cursor_factory=RealDictCursor) as cur:
cur.execute("SELECT * FROM users WHERE age > %s", (25,))
users = cur.fetchall()
for user in users:
print(f"{user['name']}: {user['age']}歳")
conn.close()
GUI開発
tkinter – 標準GUIライブラリ
import tkinter as tk
from tkinter import messagebox
class SimpleApp:
def __init__(self, root):
self.root = root
self.root.title("シンプルアプリ")
# ウィジェット作成
tk.Label(root, text="名前:").pack(pady=5)
self.name_entry = tk.Entry(root)
self.name_entry.pack(pady=5)
tk.Button(root, text="挨拶", command=self.greet).pack(pady=10)
def greet(self):
name = self.name_entry.get()
messagebox.showinfo("挨拶", f"こんにちは、{name}さん!")
root = tk.Tk()
app = SimpleApp(root)
root.mainloop()
PyQt5/PySide2 – 高機能GUI
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5 アプリ")
self.setGeometry(100, 100, 300, 200)
# 中央ウィジェット
central_widget = QWidget()
self.setCentralWidget(central_widget)
# レイアウト
layout = QVBoxLayout()
# ボタン
button = QPushButton("クリック")
button.clicked.connect(self.on_button_click)
layout.addWidget(button)
central_widget.setLayout(layout)
def on_button_click(self):
print("ボタンがクリックされました!")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
自動化・スクレイピング
Selenium – ブラウザ自動化
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ブラウザ起動
driver = webdriver.Chrome()
try:
# ページアクセス
driver.get("https://example.com")
# 要素の待機と操作
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "search-box"))
)
element.send_keys("Python")
# ボタンクリック
button = driver.find_element(By.ID, "search-button")
button.click()
# 結果の取得
results = driver.find_elements(By.CLASS_NAME, "result")
for result in results[:5]:
print(result.text)
finally:
driver.quit()
Beautiful Soup – HTMLパーサー
from bs4 import BeautifulSoup
import requests
# Webページの取得
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# 要素の抽出
title = soup.find('title').text
print(f"ページタイトル: {title}")
# すべてのリンクを取得
links = soup.find_all('a', href=True)
for link in links[:5]:
print(f"リンク: {link['href']} - {link.text}")
# CSSセレクター
articles = soup.select('article.post')
for article in articles:
headline = article.select_one('h2.title')
if headline:
print(f"記事: {headline.text}")
ファイル・システム操作
pathlib – パス操作
from pathlib import Path
import os
# パスオブジェクト作成
current_dir = Path.cwd()
file_path = Path('data/sample.txt')
print(f"現在のディレクトリ: {current_dir}")
print(f"ファイル存在: {file_path.exists()}")
print(f"親ディレクトリ: {file_path.parent}")
print(f"拡張子: {file_path.suffix}")
# ディレクトリ作成
output_dir = Path('output')
output_dir.mkdir(exist_ok=True)
# ファイル一覧取得
for txt_file in current_dir.glob('*.txt'):
print(f"テキストファイル: {txt_file}")
shutil – ファイル操作
import shutil
from pathlib import Path
# ファイルコピー
src = Path('source.txt')
dst = Path('destination.txt')
if src.exists():
shutil.copy2(src, dst)
print(f"ファイルコピー完了: {src} -> {dst}")
# ディレクトリの再帰コピー
if Path('source_dir').exists():
shutil.copytree('source_dir', 'backup_dir', dirs_exist_ok=True)
print("ディレクトリコピー完了")
# ディスク使用量
total, used, free = shutil.disk_usage('/')
print(f"ディスク使用量: {used // (1024**3)} GB / {total // (1024**3)} GB")
非同期処理
asyncio – 非同期プログラミング
import asyncio
import aiohttp
import time
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/2',
'https://httpbin.org/delay/1'
]
start_time = time.time()
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
end_time = time.time()
print(f"取得完了: {len(results)}件, 所要時間: {end_time - start_time:.2f}秒")
# 実行
asyncio.run(main())
テスト・品質管理
pytest – テストフレームワーク
import pytest
def add(a, b):
return a + b
def divide(a, b):
if b == 0:
raise ValueError("ゼロ除算エラー")
return a / b
# テスト関数
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
def test_divide():
assert divide(10, 2) == 5
assert divide(7, 2) == 3.5
def test_divide_by_zero():
with pytest.raises(ValueError):
divide(10, 0)
# パラメータ化テスト
@pytest.mark.parametrize("a,b,expected", [
(2, 3, 5),
(1, 1, 2),
(-1, 1, 0),
])
def test_add_parametrized(a, b, expected):
assert add(a, b) == expected
black – コードフォーマッター
# blackでコード整形
pip install black
black your_script.py
# 設定ファイル (pyproject.toml)
[tool.black]
line-length = 88
target-version = ['py38']
用途別ライブラリ推奨セット
データサイエンス環境
pip install numpy pandas matplotlib seaborn scipy scikit-learn jupyter
# データサイエンス用インポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
Web開発環境
pip install flask django fastapi uvicorn requests sqlalchemy psycopg2-binary
# Web開発用インポート
from flask import Flask, render_template, request
from django.shortcuts import render
from fastapi import FastAPI, HTTPException
import requests
from sqlalchemy import create_engine
自動化・スクレイピング環境
pip install selenium beautifulsoup4 requests lxml pandas openpyxl
# 自動化用インポート
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import pandas as pd
パフォーマンス・プロファイリング
cProfile – パフォーマンス分析
import cProfile
import time
def slow_function():
time.sleep(0.1)
return sum(range(1000))
def fast_function():
return sum(range(1000))
def main():
results = []
for i in range(10):
results.append(slow_function())
results.append(fast_function())
return results
# プロファイリング実行
if __name__ == '__main__':
cProfile.run('main()')
memory_profiler – メモリ使用量監視
from memory_profiler import profile
@profile
def memory_intensive_function():
# 大きなリスト作成
big_list = [i for i in range(1000000)]
# リストのコピー
big_list_copy = big_list.copy()
# 削除
del big_list
del big_list_copy
if __name__ == '__main__':
memory_intensive_function()
ライブラリ管理のベストプラクティス
仮想環境の使用
# 仮想環境作成
python -m venv myproject_env
# 仮想環境有効化
source myproject_env/bin/activate # Linux/Mac
myproject_env\Scripts\activate # Windows
# 依存関係の記録
pip freeze > requirements.txt
# 依存関係のインストール
pip install -r requirements.txt
pipenv を使った管理
# pipenv インストール
pip install pipenv
# 仮想環境とPipfile作成
pipenv install
# パッケージインストール
pipenv install requests pandas
# 開発用パッケージ
pipenv install pytest --dev
# 仮想環境に入る
pipenv shell
セキュリティ関連ライブラリ
cryptography – 暗号化
from cryptography.fernet import Fernet
# 鍵生成
key = Fernet.generate_key()
cipher_suite = Fernet(key)
# 暗号化
message = "秘密のメッセージ"
encrypted_message = cipher_suite.encrypt(message.encode())
print(f"暗号化: {encrypted_message}")
# 復号化
decrypted_message = cipher_suite.decrypt(encrypted_message)
print(f"復号化: {decrypted_message.decode()}")
hashlib – ハッシュ関数
import hashlib
def hash_password(password):
# SHA-256ハッシュ
sha256_hash = hashlib.sha256()
sha256_hash.update(password.encode('utf-8'))
return sha256_hash.hexdigest()
def hash_file(filename):
# ファイルのハッシュ値計算
hash_md5 = hashlib.md5()
with open(filename, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
# 使用例
password_hash = hash_password("my_secret_password")
print(f"パスワードハッシュ: {password_hash}")
まとめ
Python の豊富なライブラリエコシステムは、開発効率を飛躍的に向上させます。用途に応じて適切なライブラリを選択し、組み合わせることで、高品質なアプリケーションを効率的に開発できます。
ライブラリ選択の指針:
- 目的の明確化: 何を実現したいかを明確に
- メンテナンス性: アクティブに開発されているか
- ドキュメント: 充実した説明があるか
- コミュニティ: サポートが得られるか
- ライセンス: 商用利用可能か
カテゴリ別必須ライブラリ:
- データ分析: NumPy, pandas, matplotlib
- 機械学習: scikit-learn, TensorFlow, PyTorch
- Web開発: Flask, Django, FastAPI
- 自動化: Selenium, Beautiful Soup
- テスト: pytest, unittest
ベストプラクティス:
- 仮想環境での依存関係管理
- requirements.txt での バージョン固定
- 定期的なライブラリのアップデート
- セキュリティ脆弱性のチェック
本記事のライブラリとサンプルコードを参考に、あなたのプロジェクトに最適な Python 開発環境を構築してください。継続的な学習により、より効率的で高品質なソフトウェア開発が可能になります。
参考文献
- Python Package Index (PyPI)
- Python公式ドキュメント
- Awesome Python – GitHub
- Real Python ライブラリガイド
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座