在Python中随机生成大写字母和数字的字符串

我想要生成一个大小为N的字符串

它应该由数字和大写英文字母组成,例如:

  • 6U1S75
  • 4Z4UKK
  • U911K4
  • 我怎样才能以pythonic的方式实现这一点?


    一行回答:

    ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    或者使用random.choices()从Python 3.6开始更短:

    ''.join(random.choices(string.ascii_uppercase + string.digits, k=N))
    

    密码更安全的版本; 请参阅https://stackoverflow.com/a/23728630/2213647:

    ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    详细地说,使用干净的函数进一步重用:

    >>> import string
    >>> import random
    >>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    ...    return ''.join(random.choice(chars) for _ in range(size))
    ...
    >>> id_generator()
    'G5G74W'
    >>> id_generator(3, "6793YUIO")
    'Y3U'
    

    它是如何工作的 ?

    我们进口string ,包含普通的ASCII字符序列的模块,并random ,与随机生成涉及的模块。

    string.ascii_uppercase + string.digits只是连接代表大写ASCII字符和数字的字符列表:

    >>> string.ascii_uppercase
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    >>> string.digits
    '0123456789'
    >>> string.ascii_uppercase + string.digits
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    

    然后我们使用列表理解来创建'n'元素列表:

    >>> range(4) # range create a list of 'n' numbers
    [0, 1, 2, 3]
    >>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
    ['elem', 'elem', 'elem', 'elem']
    

    在上面的例子中,我们使用[创建列表,但是我们不在id_generator函数中,因此Python不会在内存中创建列表,但会一个接一个地生成元素(这里更多地介绍这一点) 。

    我们不要求创建字符串elem 'n'次,而是要求Python创建'n'次的随机字符,并从字符序列中挑选出来:

    >>> random.choice("abcde")
    'a'
    >>> random.choice("abcde")
    'd'
    >>> random.choice("abcde")
    'b'
    

    因此, random.choice(chars) for _ in range(size)实际上是创建一个size字符序列。 从chars中随机选取的chars

    >>> [random.choice('abcde') for _ in range(3)]
    ['a', 'b', 'b']
    >>> [random.choice('abcde') for _ in range(3)]
    ['e', 'b', 'e']
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'a', 'c']
    

    然后我们只用一个空字符串将它们连接起来,这样序列就成为一个字符串:

    >>> ''.join(['a', 'b', 'b'])
    'abb'
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'c', 'b']
    >>> ''.join(random.choice('abcde') for _ in range(3))
    'dac'
    

    这个堆栈溢出问题是当前谷歌对“随机字符串Python”的结果。 当前最重要的答案是:

    ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    这是一个很好的方法,但随机PRNG不是加密安全的。 我假设很多研究这个问题的人都希望为随机密码或密码生成随机字符串。 你可以通过在上面的代码中做一些小改动来安全地做到这一点:

    ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    使用random.SystemRandom()而不是随机在* nix机器上使用/ dev / urandom,在Windows中使用CryptGenRandom() 。 这些是密​​码安全的PRNG。 在需要安全PRNG的应用程序中使用random.choice而不是random.SystemRandom().choice可能具有潜在的破坏性,并且考虑到这个问题的普及,我敢打赌,已经犯了很多错误。

    如果您使用python3.6或更高版本,则可以使用新的秘密模块。

    ''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    该模块文档还讨论了生成安全令牌和最佳实践的便捷方法。


    只需使用Python的内置uuid:

    如果UUID适合您的用途,请使用内置的uuid软件包。

    一线解决方案:

    import uuid; str(uuid.uuid4().get_hex().upper()[0:6])

    深度版本:

    例:

    import uuid
    uuid.uuid4() #uuid4 => full random uuid
    # Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')
    

    如果您确实需要格式(例如,“6U1S75”),则可以这样做:

    import uuid
    
    def my_random_string(string_length=10):
        """Returns a random string of length string_length."""
        random = str(uuid.uuid4()) # Convert UUID format to a Python string.
        random = random.upper() # Make all characters uppercase.
        random = random.replace("-","") # Remove the UUID '-'.
        return random[0:string_length] # Return the random string.
    
    print(my_random_string(6)) # For example, D9E50C
    
    链接地址: http://www.djcxy.com/p/2951.html

    上一篇: Random string generation with upper case letters and digits in Python

    下一篇: UIScrollbar component not working in flash cs4