0

我正在尝试使用 python 创建一个简单的密码生成器,它读取您以以下格式提供的模式,A用于大写字符、小写字符、a数字$#符号。模式将通过命令行参数给出,并由sys.exit()方法返回输出。

出于某种原因,我的脚本无法正常工作,对我来说看起来很好,我似乎无法弄清楚它有什么问题。它在我的终端窗口上输出一个空行。

#!/usr/bin/env python
# IMPORTS
import os
import sys
import random

alc = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
auc = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
sym = ["!", "#", "%", "&", "?", "@", "(", ")", "[", "]", "<", ">", "*", "+", ",", ".", "~", ":", ";", "=", "-", "_", "\\", "/"]

pattern = list(sys.argv[1])
password = ""

# PROCESSING

for x in pattern:
    if x == "A":
        random.shuffle(auc)
        password.join(auc[0])
    elif x == "a":
        random.shuffle(alc)
        password.join(alc[0])
    elif x == "$":
        random.shuffle(num)
        password.join(num[0])
    elif x == "#":
        random.shuffle(sym)
        password.join(sym[0])
    else:
        password = "ERROR: Invalid Syntax."
        break

# END PROCESSING

sys.exit(password)
4

3 回答 3

1

这是您想要做的更简单的版本:

import os
import sys
import random
import string

vals = {'a': string.ascii_lowercase,
        'b': string.ascii_uppercase,
        '$': '0123456789',
        '#': '!#%&?@()[]<>*+,.~:;=-_\\/',
       }

pattern = sys.argv[1]

password = ''.join(random.choice(vals[c]) for c in pattern) # assumes that there are no invalid characters in the input

password = ''.join(random.choice(vals[c][0]) for c in pattern if c in vals) # takes only the valid characters in the input

random.shuffle是一个相对昂贵的操作,洗牌整个列表。另一方面,random.choice在可迭代对象中选择一个随机元素。

希望这可以帮助

于 2013-07-21T06:20:12.793 回答
1

字符串是不可变的,因此当您调用 时join(),它不会更改password。它返回输出。

password.join(thelist[0])

应该:

password = password.join(thelist[0])

所以当你去打印时password,只会''出现,因为你从来没有改变它。

join这里甚至不需要。你可以做到password += auc[0]。我在下面展示了这个。

您也可以清理代码中的一些内容。该string模块将帮助您:

>>> import string
>>> print list(string.lowercase)
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> print list(string.uppercase)
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
>>> print list(string.punctuation)
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
>>> print list(string.digits)
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

而不是洗牌列表,您可以使用random.choice()

for x in pattern:
    if x == "A":
        password += random.choice(auc)
    elif ...

于 2013-07-21T06:01:07.627 回答
1

你必须使用password = password.join(alc[0])password += alc[0]

A.join(b)不改变A。它创建一个与它相同的新字符串A+b并返回它,但A保持不变。

于 2013-07-21T06:07:51.350 回答