帮你整理了下格式:
[Python] 纯文本查看 复制代码 python
随机密码生成工具
使用 secrets 模块生成安全随机密码,支持命令行参数指定长度和输出文件路径。
"""
import secrets
import string
import argparse
import csv
import os
from datetime import datetime
def generate_password(length=12):
"""生成包含大小写字母、数字和特殊符号的随机密码。
确保密码中至少包含每种字符类型各一个,其余字符从全部字符集中随机选取。
"""
if length < 4:
raise ValueError("密码长度不能小于4(需至少包含每种字符类型各一个)")
uppercase = string.ascii_uppercase
lowercase = string.ascii_lowercase
digits = string.digits
special = "!@#$%^&*()-_=+[]{}|;:,.<>?"
# 先确保每种字符至少出现一次
password = [
secrets.choice(uppercase),
secrets.choice(lowercase),
secrets.choice(digits),
secrets.choice(special),
]
all_chars = uppercase + lowercase + digits + special
password += [secrets.choice(all_chars) for _ in range(length - 4)]
# 打乱顺序(使用 secrets 的安全随机方式)
# Fisher-Yates 洗牌算法
for i in range(len(password) - 1, 0, -1):
j = secrets.randbelow(i + 1)
password, password[j] = password[j], password
return "".join(password)
def save_to_csv(password, length, output_file):
"""将密码信息追加写入 CSV 文件。
如果文件不存在则自动创建并写入表头。
"""
file_exists = os.path.isfile(output_file)
try:
with open(output_file, "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(["时间戳", "密码", "长度"])
writer.writerow([
datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
password,
length,
])
except OSError as e:
print(f"文件写入失败: {e}")
raise
def main():
parser = argparse.ArgumentParser(description="随机密码生成工具")
parser.add_argument(
"-l", "--length",
type=int,
default=12,
help="密码长度(默认12位)",
)
parser.add_argument(
"-o", "--output",
type=str,
default="passwords.csv",
help="输出CSV文件路径(默认 passwords.csv)",
)
args = parser.parse_args()
try:
password = generate_password(args.length)
except ValueError as e:
print(f"错误: {e}")
return
save_to_csv(password, args.length, args.output)
print(f"已生成密码: {password}")
print(f"长度: {args.length} | 已保存至: {args.output}")
if __name__ == "__main__":
main() |