ランダム文字列を生成する

初期パスワードやトークンでランダム文字列を生成したいことがあるかと思いますが、Python3.6以降の場合、標準モジュールrandomのchoicesメソッドを使用すると簡単にランダム文字列を生成することができます。3.6より古い場合は少し工夫が必要です。

random.choicesメソッドによるランダム文字列生成(Python3.6以降)

random.choicesメソッドは、引数で指定したシーケンシャルオブジェクトから重複ありで指定した個数分、ランダムに要素を抜き出します。pythonの文字列はシーケンシャルなオブジェクトですので、ascii文字列からランダムな5文字を得る場合には以下のようにします。kで抜き出す文字数5を指定しています。

import random
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
random.choices(letters, k=5)
#  ['R', 'n', 'J', 'T', 'k']
# 

あとは、joinで結合すればよいでしょう。また、ascii文字列セットについてはstringモジュールで提供されているため、以下のように書くことができます。

import random
import string

# ascii文字列で生成する場合
''.join(random.choices(string.ascii_letters, k=5))
#  'WQmEL'
#

# asciiと数字で生成する場合
''.join(random.choices(string.ascii_letters + string.digits, k=5))
# 'T67lZ'
#  

 

random.choiceメソッドによるランダム文字列生成(Python3.6より前)

3.6より古い場合は、randome.choiceメソッドを使用します。randome.choiceメソッドは、引数で指定したシーケンシャルオブジェクトからランダムに要素を1つ抜き出します。

import random
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
random.choice(letters)
# 'b'

以下の通り、リスト内包表記を使用すると、3.6系で提供されたrandom.choicesメソッドと同等の処理を記述することが可能です。

import random
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
[random.choice(letters) for _ in range(5)]
#  ['s', 'O', 'G', 'm', 'v']
# 

for内の変数は使用しないため、アンダースコアを使用しています。あとはjoinで結合すると良いでしょう。上と同様にascii文字列セットについてはstringモジュールを使用すると、以下のように書くことができます。

import random
import string

# ascii文字列で生成する場合
''.join([random.choice(letters) for _ in range(5)])
#  'QMhgc'
#

# asciiと数字で生成する場合
''.join([random.choice(letters) for _ in range(5)])
# 'Akshe'
#  

リスト内包表記を使用する分ひと手間増えますね。