Generating random text strings of a given pattern
Question:
I need to generate random text strings of a particular format. Would like some ideas so that I can code it up in Python. The format is <8 digit number><15 character string>.
Answers:
See an example – Recipe 59873: Random Password Generation .
Building on the recipe, here is a solution to your question :
from random import choice
import string
def GenPasswd2(length=8, chars=string.letters + string.digits):
return ''.join([choice(chars) for i in range(length)])
>>> GenPasswd2(8,string.digits) + GenPasswd2(15,string.ascii_letters)
'28605495YHlCJfMKpRPGyAw'
>>>
#!/usr/bin/python
import random
import string
digits = "".join( [random.choice(string.digits) for i in xrange(8)] )
chars = "".join( [random.choice(string.letters) for i in xrange(15)] )
print digits + chars
EDIT: liked the idea of using random.choice better than randint() so I’ve updated the code to reflect that.
Note: this assumes lowercase and uppercase characters are desired. If lowercase only then change the second list comprehension to read:
chars = "".join( [random.choice(string.letters[:26]) for i in xrange(15)] )
Obviously for uppercase only you can just flip that around so the slice is [26:] instead of the other way around.
random.sample
is an alternative choice. The difference, as can be found in the python.org documentation, is that random.sample
samples without replacement. Thus, random.sample(string.letters, 53)
would result in a ValueError
. Then if you wanted to generate your random string of eight digits and fifteen characters, you would write
import random, string
digits = ''.join(random.sample(string.digits, 8))
chars = ''.join(random.sample(string.letters, 15))
Here’s a simpler version:
import random
import string
digits = "".join( [random.choice(string.digits+string.letters) for i in xrange(10)] )
print digits
Shorter version since python 3.6.2, with random.choices
over random.choice which doesn’t need a for loop, but instead just pass k, the length of the random string required.
import random
import string
x = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
print(x)
You can also add string.punctuation
if you need string with punctuation characters.
I need to generate random text strings of a particular format. Would like some ideas so that I can code it up in Python. The format is <8 digit number><15 character string>.
See an example – Recipe 59873: Random Password Generation .
Building on the recipe, here is a solution to your question :
from random import choice
import string
def GenPasswd2(length=8, chars=string.letters + string.digits):
return ''.join([choice(chars) for i in range(length)])
>>> GenPasswd2(8,string.digits) + GenPasswd2(15,string.ascii_letters)
'28605495YHlCJfMKpRPGyAw'
>>>
#!/usr/bin/python
import random
import string
digits = "".join( [random.choice(string.digits) for i in xrange(8)] )
chars = "".join( [random.choice(string.letters) for i in xrange(15)] )
print digits + chars
EDIT: liked the idea of using random.choice better than randint() so I’ve updated the code to reflect that.
Note: this assumes lowercase and uppercase characters are desired. If lowercase only then change the second list comprehension to read:
chars = "".join( [random.choice(string.letters[:26]) for i in xrange(15)] )
Obviously for uppercase only you can just flip that around so the slice is [26:] instead of the other way around.
random.sample
is an alternative choice. The difference, as can be found in the python.org documentation, is that random.sample
samples without replacement. Thus, random.sample(string.letters, 53)
would result in a ValueError
. Then if you wanted to generate your random string of eight digits and fifteen characters, you would write
import random, string
digits = ''.join(random.sample(string.digits, 8))
chars = ''.join(random.sample(string.letters, 15))
Here’s a simpler version:
import random
import string
digits = "".join( [random.choice(string.digits+string.letters) for i in xrange(10)] )
print digits
Shorter version since python 3.6.2, with random.choices
over random.choice which doesn’t need a for loop, but instead just pass k, the length of the random string required.
import random
import string
x = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
print(x)
You can also add string.punctuation
if you need string with punctuation characters.