我正在编写一个程序,该程序随机生成任意数量的ASCII字符的组合。
import random
import string
string.printable
sP = string.printable
def random_pass(stringLength):
x = sP
return ''.join((random.choice(x)) for i in range(stringLength))
if x == '<0x0c>' or '<0x0b>:
print("Try again!")
print('You'\re password is: ', random_pass(12))
<0x0c>
和<0x0b>
代表什么?答案 0 :(得分:0)
根据common strings operations上的Python文档:
string.printable
被认为是可打印的字符串。这是数字,字母,标点符号和空格的组合。
,空格定义为:
string.whitespace
一个字符串,其中包含所有被视为空格的字符。在大多数系统上,这包括字符空格,制表符,换行符, 返回,换页和垂直标签。
因此有时在random.choice(x)
中包含那些字符是很正常的
您可能不应该使用string.printable
,而应使用string.ascii_letters + string.digits + string.punctuation
答案 1 :(得分:0)
<0x0c>和<0x0b>代表什么?
在程序的某些迭代过程中,这些字符代码被打印出来。
0x0c
是换行符0x0b
是垂直制表符您可以在ASCII table
中查找它们它们代表空白吗?
是的,它们是string.whitespace
我的random_pass()函数中的if语句不忽略字符代码出现在输出中。这就是为什么我现在寻求帮助。
您要检查0x0c
和0x0b
的条件永远不会执行,因为它放在return
的{{1}}语句之后。
@ Tigre-Bleu已经建议您使用random_pass
而不是string.ascii_letters + string.digits + string.punctuation
此外,在生成密码时,您应该使用具有强大加密功能的随机数生成器。如果您使用Python> = 3.6,则可以使用secrets
模块:
string.printable
对于Python <3.6,您可以使用random.SystemRandom()
,它将在支持它的系统上使用os.urandom()
:
import secrets
import string
def random_pass(stringLength):
alphabet = string.ascii_letters + string.digits + string.punctuation
password = ''.join(secrets.choice(alphabet) for i in range(stringLength))
return password
print('Your password is:', random_pass(12))
# Your password is: 2;=1!*A.dK;+