random Buchstaben in Python generieren?
Ich benötige einen "Zufallsgenerator" in Python, der mir zufällige Buchstabenkombinationen ausgibt (max. 7 Zeichen). Z.B. afhutpz, mkwrypb.
5 Antworten
import random
print(''.join([chr(random.randrange(97, 123)) for _ in range(7)]))
oder
import random
import string
print(''.join([random.choice(string.ascii_letters.lower()) for _ in range(7)]))
Aber schwerer lesbar: chr(random.randrange(97,123)) zur Erzeugung eines zufälligen Kleinbuchstabens hat man entweder schon x-mal gemacht (und dann bestimmt nicht in Python) oder man muss es jedesmal nachschlagen.
choice(iterable) ist da mehr Pythonese
und "import string" benötigst du nur für "ascii_letters"
import random
random.seed()
chr='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
pwd="".join(random.sample(chr,7))
chr kann nach belieben definiert werden, insbesondere geht z.B. auch sowas:
chr="αβψδεφγηιξκλμνοπ;ρστθωςχζυ"
>>> "".join(random.sample(chr,7))
'γνξοπρη'
Alternativ auch:
"".join(random.choices(chr,k=7))
Nachteil bei diesem Ansatz ist aber einfach, daß es einfach nicht sicher genug ist.
Besser wäre (einem Beispiel aus der Python Doku folgend):
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
Anstatt der Zeichengruppen aus string kann hier natürlich wieder ein eigener Zeichenvorrat verwendet werden.
------
Normalerweise würde ich ja sowas machen wie:
with open ('/dev/random','rb') as f:
secret=f.read(7)
Und dann auf den Zeichenvorrat ummappen. Dank secrets module ist das aber glücklicherweise nicht mehr nötig, denn das bietet im Endeffekt das gleiche nur gewrapped, einfach zu nutzen und OS-unabhängig: secret.token_bytes()
from random import choice
def abc(klein=None) :
'''Gibt das volständige Alphabet aus.
'''
if klein is None :
abc = [chr(i) for i in range(65, 123)]
for Nr in range(6) :
del abc[26]
return abc[26:len(abc):]+ abc[:26:]
if klein is True :
return [chr(i) for i in range(97, 123)]
if klein is False :
return [chr(i) for i in range(65, 91)]
a = ''
for Nr in range(7) :
a += choice(abc())
Zufallszahl generieren und auf Buchstaben mappen.
Die zweite Version ist schöner. Zum Passwörter generieren kann man den Zeichenvorrat vorgeben und die ähnlichen Buchstaben oO0 / 1ilI weglassen: