【Python】ランダムな文字列を生成する方法(stringモジュールとrandom.choices)

テストデータの作成や、一時的なセッションIDの発行など、プログラム内で「ランダムな文字列」を生成したい場面は多岐にわたります。

Pythonでは、標準ライブラリの random モジュールと、文字種定義を持つ string モジュールを組み合わせることで、指定した長さや文字種のランダム文字列を容易に生成できます。ここでは、定数の種類と実装コードについて解説します。

目次

stringモジュールの定数一覧

ランダム生成の「素材」となる文字セットは、string モジュールにあらかじめ定義されています。手動で "abcdef..." と書く必要はなく、以下の定数を利用するのが一般的です。

属性名 (stringモジュール)内容 (文字セット)説明
string.ascii_lettersa-z および A-Zアルファベット全文字(大小区別あり)
string.ascii_lowercasea-zアルファベット小文字のみ
string.ascii_uppercaseA-Zアルファベット大文字のみ
string.digits0-9数字のみ
string.punctuation!”#$%&…記号のみ

実装例:一時的なアクセストークンの生成

以下のコードは、random.choices を使用して、指定された長さのランダムな文字列を生成する関数です。英字のみのパターンと、英数字を混在させたパターンの2通りを実装しています。

import random
import string

def generate_random_string(length, char_type="alphanumeric"):
    """
    指定された長さと文字種でランダムな文字列を生成する
    """
    if char_type == "alpha":
        # 英字のみ (a-z, A-Z)
        source_chars = string.ascii_letters
    elif char_type == "alphanumeric":
        # 英字 + 数字 (a-z, A-Z, 0-9)
        source_chars = string.ascii_letters + string.digits
    else:
        # デフォルトなど
        source_chars = string.ascii_letters + string.digits

    # 1. random.choicesでリストとしてランダムに文字を取得
    #    k=length で取得する文字数を指定します
    random_list = random.choices(source_chars, k=length)

    # 2. リストを結合して1つの文字列にする
    return "".join(random_list)

def main():
    # ケース1: 英字のみのランダム文字列 (5文字)
    # 用途例: 簡易的な識別コード
    token_alpha = generate_random_string(5, "alpha")
    print(f"英字のみ(5文字): {token_alpha}")

    # ケース2: 英数字混在のランダム文字列 (12文字)
    # 用途例: セッションIDや一時パスワード
    token_alphanum = generate_random_string(12, "alphanumeric")
    print(f"英数字混在(12文字): {token_alphanum}")

if __name__ == "__main__":
    main()

コードの解説

random.choices(population, k=N)

Python 3.6から追加されたメソッドです。指定されたシーケンス(population)から、重複ありでランダムに k 個の要素を選び出し、リストとして返します。

“”.join(…)

random.choices の戻り値は [‘a’, ‘B’, ‘c’] のようなリスト形式であるため、join メソッドを使って空文字 “” で結合し、単一の文字列 aBc に変換しています。

注意点

random モジュールは疑似乱数生成器であり、暗号学的に安全ではありません。本格的なパスワード生成やセキュリティに関わるトークン生成には、Python 3.6以降で標準搭載された secrets モジュールの使用を検討してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次