Python標準ライブラリの活用:ランダム処理・ファイル操作・データ直列化

randomモジュールによる乱数生成とデータ選択

Pythonのrandomモジュールは、様々なパターンの乱数を生成するための機能を提供します。

import random

# 0.0 以上 1.0 未満の浮動小数点数を生成
random.random()

# 指定範囲内の整数をランダムに選択(例: 1〜10)
random.randint(1, 10)

# 指定範囲内の浮動小数点数を生成(例: 1.5〜7.8)
random.uniform(1.5, 7.8)

# シーケンスから無作為に1要素を選択
random.choice(['apple', 'banana', 'cherry'])

# シーケンスから複数の要素を重複なしでサンプリング
random.sample(range(100), k=5)

# リスト内の要素をシャッフル(破壊的変更)
items = [1, 2, 3, 4, 5]
random.shuffle(items)

文字列ベースの認証コード生成

英数字混合の動的認証コードを生成する関数の実装例:

def generate_auth_code(length):
    code_chars = []
    for _ in range(length):
        # 数字 (0-9)
        digit = str(random.randint(0, 9))
        # 大文字アルファベット (A-Z)
        upper = chr(random.randint(65, 90))
        # 小文字アルファベット (a-z)
        lower = chr(random.randint(97, 122))
        # 3種類の中から無作為に1文字を選択
        selected_char = random.choice([digit, upper, lower])
        code_chars.append(selected_char)
    return ''.join(code_chars)

# 使用例:8桁の認証コードを生成
auth_code = generate_auth_code(8)
print(auth_code)  # 出力例: A3k9MxP2

osモジュールによるファイルシステム操作

オペレーティングシステムとの連携を可能にするosモジュールの主な用途です。

ディレクトリ操作

import os

# 単一階層のディレクトリ作成
os.mkdir('new_folder')

# 複数階層のディレクトリ作成(ネスト可)
os.makedirs('parent/child/grandchild', exist_ok=True)

# 空のディレクトリを削除
os.rmdir('empty_dir')

# 階層的に空ディレクトリを削除
os.removedirs('dir1/dir2/dir3')  # 上位ディレクトリも空なら削除

パス操作とファイル情報取得

# スクリプトの配置されているディレクトリを取得
current_dir = os.path.dirname(__file__)

# パスの結合(OS依存の区切り文字を自動処理)
config_path = os.path.join(current_dir, 'config', 'settings.json')

# 指定ディレクトリ内の全ファイルをリスト表示
files = os.listdir('/path/to/directory')

# ファイル属性の確認
os.path.exists(config_path)     # 存在チェック
os.path.isfile(config_path)     # ファイルか?
os.path.isdir(config_path)      # ディレクトリか?
os.path.getsize(config_path)    # サイズ(バイト)

# カレントワーキングディレクトリの取得と変更
current_path = os.getcwd()
os.chdir('/new/working/directory')

sysモジュール:Pythonインタプリタとのインターフェース

sysモジュールはPythonランタイム環境に関する情報を提供します。

import sys

# モジュール検索パスの表示
print(sys.path)

# Pythonバージョン情報
print(sys.version)

# OSプラットフォーム識別子
print(sys.platform)  # 例: 'win32', 'linux', 'darwin'

# コマンドライン引数の取得
if len(sys.argv) >= 3:
    user = sys.argv[1]
    pwd = sys.argv[2]
    if user == 'admin' and pwd == 'secret':
        print("ログイン成功")
    else:
        print("認証失敗")
else:
    print("使用法: python script.py <user> <password>")

jsonモジュールによるデータの直列化

構造化データをJSON形式で保存・復元する方法です。言語間のデータ交換に適しています。

import json

# Pythonオブジェクト → JSON文字列(シリアライズ)
data = {
    'name': '山田太郎',
    'age': 32,
    'skills': ['Python', 'JavaScript', 'SQL']
}
json_str = json.dumps(data, ensure_ascii=False, indent=2)

# JSON文字列 → Pythonオブジェクト(デシリアライズ)
parsed_data = json.loads(json_str)

# ファイルへの直接書き込み/読み込み
with open('user_data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open('user_data.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)

subprocessモジュールによる外部コマンド実行

他のプロセスを起動し、その出力を取得することが可能です。

import subprocess

# システムコマンドを実行(Windows例)
result = subprocess.Popen(
    'ipconfig',
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

# 成功時の出力をデコードして取得(日本語環境対応)
stdout_data = result.stdout.read().decode('cp932')
stderr_data = result.stderr.read().decode('cp932')

print("標準出力:\n", stdout_data)
if stderr_data:
    print("エラー出力:\n", stderr_data)

設定データの永続化実装例

ユーザー入力を受け付け、JSON形式でローカルに保存する処理:

import os
import json

BASE_DIR = os.path.dirname(__file__)
DB_DIR = os.path.join(BASE_DIR, 'db')
os.makedirs(DB_DIR, exist_ok=True)

def save_user_profile(username, password):
    file_path = os.path.join(DB_DIR, f'{username}.json')
    profile = {'username': username, 'pwd': password}
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(profile, f, ensure_ascii=False, indent=2)

# 実際の使用
# uname = input('ユーザー名: ')
# passwd = input('パスワード: ')
# save_user_profile(uname, passwd)

タグ: random OS sys JSON subprocess

6月19日 16:13 投稿