Skip to content

Instantly share code, notes, and snippets.

@windoze
Created February 6, 2020 08:40
Show Gist options
  • Save windoze/719af4120c849a2110c0f4d479e67d56 to your computer and use it in GitHub Desktop.
Save windoze/719af4120c849a2110c0f4d479e67d56 to your computer and use it in GitHub Desktop.
Generate random string
#!/usr/bin/python3
import string
import random
import itertools
import argparse
IDENT_FIRST = string.ascii_letters + '_'
IDENT_LAST = string.ascii_letters + string.digits + '_'
def pick(char_set, count=1):
return ''.join([random.choice(char_set) for _ in range(count)])
def chunk(xs, n):
ys = list(xs)
random.shuffle(ys)
size = len(ys) // n
leftovers = ys[size*n:]
for c in range(n):
if leftovers:
extra = [leftovers.pop()]
else:
extra = []
yield ys[c*size:(c+1)*size] + extra
def gen_password(count=12):
lens = list(chunk(range(count), 4))
lower = len(lens[0])
upper = len(lens[1])
number = len(lens[2])
special = len(lens[3])
lower_str = [pick(string.ascii_lowercase) for _ in range(lower)]
upper_str = [pick(string.ascii_uppercase) for _ in range(upper)]
number_str = [pick(string.digits) for _ in range(number)]
special_str = [pick(string.punctuation) for _ in range(special)]
l = list(itertools.chain.from_iterable(
lower_str + upper_str + number_str + special_str))
random.shuffle(l)
return ''.join(l)
result = ''
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-c', '--count', dest='count', metavar='N', type=int, default=10,
help='number of the letters')
parser.add_argument('-u', '--upper', dest='upper', action='store_true',
help='uppercase letters only')
parser.add_argument('-l', '--lower', dest='lower', action='store_true',
help='lowercase letters only')
parser.add_argument('-n', '--number', dest='number', action='store_true',
help='include numbers')
parser.add_argument('-i', '--ident', dest='ident', action='store_true',
help='generate an identifier')
parser.add_argument('-p', '--password', dest='password', action='store_true',
help='generate a password')
args = parser.parse_args()
if args.ident:
result = pick(IDENT_FIRST) + pick(IDENT_LAST, args.count-1)
elif args.password:
result = gen_password(args.count)
elif args.upper:
if args.number:
result = pick(string.ascii_uppercase + string.digits, args.count)
else:
result = pick(string.ascii_uppercase, args.count)
elif args.lower:
if args.number:
result = pick(string.ascii_lowercase + string.digits, args.count)
else:
result = pick(string.ascii_lowercase, args.count)
elif args.number:
result = pick(string.ascii_letters + string.digits, args.count)
else:
result = pick(string.ascii_letters, args.count)
print(result)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment