Generate password in python

前端 未结 9 1964
既然无缘
既然无缘 2020-12-12 21:51

I\'dl like to generate some alphanumeric passwords in python. Some possible ways are:

import string
from random import sample, choice
chars = string.letters          


        
相关标签:
9条回答
  • 2020-12-12 22:27

    I wrote a script with my preferences, which mostly are concerned with avoiding mistakes when transcribing and remembering. (For example: remove somewhat ambiguous and no repeated characters.)

    import optparse
    import os
    import random
    import sys
    
    DEFAULT_CHARS = "234679ADEFGHJKLMNPRTUWabdefghijkmnpqrstuwy"
    DEFAULT_LEN = 18
    
    def choices(options, length, choice=random.choice):
      return (choice(options) for _ in xrange(length))
    
    def choices_non_repeated(options, length, choice=random.choice):
      assert len(options) > 1
      last = choice(options)
      count = 0
      while count < length:
        yield last
        count += 1
    
        while True:
          value = choice(options)
          if value != last:
            last = value
            break
    
    def main(args):
      op = optparse.OptionParser(add_help_option=False)
      op.add_option("--help", action="help",
        help="show help message and exit")
      op.add_option("-b", "--bare", action="store_true", default=False,
        help="print passwords without trailing newline")
      op.add_option("-c", "--chars", metavar="SET", nargs=1, default=DEFAULT_CHARS,
        help="character set to use (default: %default)")
      op.add_option("--repeat", action="store_true", default=False,
        help="allow repetition")
      op.add_option("-l", "--len", dest="max", nargs=1, type="int", default=DEFAULT_LEN,
        help="max length (default: %default)")
      op.add_option("--min", nargs=1, type="int", default=None,
        help="min length (defaults to max)")
      op.add_option("-n", "--count", nargs=1, type="int", default=None,
        help="number of passwords to generate (default: %default)")
      op.add_option("--cols", type="int", default=None,
        help="number of columns to use")
      opts, args = op.parse_args(args)
      if args:
        op.error("unknown arguments")
    
      if os.isatty(sys.stdin.fileno()) and (
        opts.count is None and opts.cols is None
        and not opts.bare
      ):
        opts.cols = 80 // (opts.max + 1)
        opts.count = opts.cols * 25
      else:
        if opts.count is None:
          opts.count = 1
        if opts.cols is None:
          opts.cols = 1
    
      if opts.bare and opts.cols != 1:
        op.error("bare output requires --cols=1")
    
      if opts.min == None:
        opts.min = opts.max
    
      if any(x < 1 for x in [opts.cols, opts.count, opts.min, opts.max]):
        op.error("values must be >= 1")
    
      choices_func = choices_non_repeated
      if opts.repeat:
        choices_func = choices
      elif len(set(opts.chars)) < 2:
        op.error("must allow repetition or provide a longer character set")
        return "op.error shouldn't return"
    
      col = 0
      for _ in xrange(opts.count):
        length = random.randint(opts.min, opts.max)
        password = "".join(choices_func(opts.chars, length))
        sys.stdout.write(password)
        if not opts.bare:
          col += 1
          if col == opts.cols:
            sys.stdout.write("\n")
            col = 0
          else:
            sys.stdout.write(" ")
    
    
    if __name__ == "__main__":
      sys.exit(main(sys.argv[1:]))
    
    0 讨论(0)
  • 2020-12-12 22:32

    Here in the line 9 of above coding:

    return (choice(options) for _ in xrange(length))
    

    Actually the xrange is not defined, so the correct coding for this is:

    return (choice(options) for _ in range(length))
    

    Same in 76 line too.

    0 讨论(0)
  • 2020-12-12 22:34

    You may want to use map instead of list comprehensions:

    ''.join(map(lambda x: random.choice(chars), range(length)))
    
    0 讨论(0)
提交回复
热议问题