侧边栏壁纸
博主头像
YOUZI

我依旧在追寻自由的路上

  • 累计撰写 85 篇文章
  • 累计创建 10 个分类
  • 累计创建 27 个标签

目 录CONTENT

文章目录

随机字符生成

柚子
原创 / 2024-08-19 / 0 评论 / 0 点赞 / 20 阅读 / 0 字
温馨提示:
本文最后更新于30天前,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响您的利益,请联系 站长 删除。

背景

自己创建文章口令太费脑了,不想使用统一口令,所以……便有了下面。

代码

import random
import string
import json
import os
from datetime import datetime
from typing import Dict, List, Union

# 定义JSON文件的路径
json_file_path = 'test.json'


def generate_random_string(length: int = 6) -> str:
    """
    生成指定长度的随机字符串。

    参数:
    length: 生成的字符串长度,默认为6。

    返回:
    生成的随机字符串。
    """
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))


def read_existing_data() -> Dict[str, Union[List[Dict[str, str]], Dict[str, str]]]:
    """
    读取现有的数据。

    返回:
    一个字典,包含现有的数据,如果文件不存在或无法解析,则返回空字典。
    """
    if os.path.exists(json_file_path):
        try:
            with open(json_file_path, 'r', encoding='utf-8') as file:
                data = json.load(file)
                if isinstance(data, dict):
                    return data
                else:
                    print("警告: JSON 文件的格式不正确,重新创建一个空字典。")
                    return {}
        except json.JSONDecodeError:
            print("警告: 无法解析 JSON 文件,重新创建一个空字典。")
            return {}
    else:
        return {}


def get_existing_random_strings(existing_data: Dict[str, Union[List[Dict[str, str]], Dict[str, str]]]) -> set:
    """
    获取现有的随机字符串。

    参数:
    existing_data: 包含现有数据的字典。

    返回:
    一个包含所有已有随机字符串的集合。
    """
    existing_random_strings = set()
    for entries in existing_data.values():
        if isinstance(entries, list):
            for item in entries:
                existing_random_strings.add(item['random_string'])
        elif isinstance(entries, dict):
            existing_random_strings.add(entries['random_string'])
    return existing_random_strings


def append_to_existing_name(name: str, random_string: str, timestamp: str) -> None:
    """
    将新的随机字符串追加到现有代号的记录中。

    参数:
    name: 代号。
    random_string: 需要追加的随机字符串。
    timestamp: 记录的时间戳。
    """
    existing_data = read_existing_data()
    if name in existing_data:
        if isinstance(existing_data[name], list):
            existing_data[name].append({
                "random_string": random_string,
                "timestamp": timestamp
            })
        else:
            existing_data[name] = [existing_data[name], {
                "random_string": random_string,
                "timestamp": timestamp
            }]
    else:
        existing_data[name] = [{
            "random_string": random_string,
            "timestamp": timestamp
        }]

    with open(json_file_path, 'w', encoding='utf-8') as file:
        json.dump(existing_data, file, indent=4, ensure_ascii=False)


def generate_unique_string() -> str | None:
    """
    生成唯一的随机字符串并追加到记录中。

    返回:
    生成的唯一字符串,如果操作被取消或失败则返回None。
    """
    existing_data = read_existing_data()

    name = input("请输入代号: ").strip()
    if not validate_name(name):
        return

    existing_random_strings = get_existing_random_strings(existing_data)

    if name in existing_data and not confirm_new_record(name):
        print("操作已取消,不会创建新记录。")
        return
    generate_and_append_string(name, existing_random_strings)


def validate_name(name: str) -> bool:
    """
    验证代号是否有效。

    参数:
    name: 需要验证的代号。

    返回:
    如果代号有效返回True,否则返回False。
    """
    if not name:
        print("代号不能为空,请重新输入。")
        return False
    return True


def confirm_new_record(name: str) -> bool:
    """
    确认是否为指定代号创建新记录。

    参数:
    name: 需要确认的代号。

    返回:
    如果用户确认创建新记录返回True,否则返回False。
    """
    print(f"代号 '{name}' 已存在。")
    user_choice = input("是否要为该代号创建新记录?(是/否): ").strip().lower()
    return user_choice == '是'


def generate_and_append_string(name: str, existing_random_strings: set) -> str:
    """
    生成新的唯一随机字符串并追加到记录中。

    参数:
    name: 代号。
    existing_random_strings: 现有的随机字符串集合。

    返回:
    生成的唯一随机字符串。
    """
    while True:
        new_string = generate_random_string()
        if new_string not in existing_random_strings:
            timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            append_to_existing_name(name, new_string, timestamp)
            print(f"生成的随机字符: {new_string}")
            print(f"记录时间: {timestamp}")
            return new_string


if __name__ == "__main__":
    generate_unique_string()

效果

初次

请输入代号: 测试1
生成的随机字符: grdUvO
记录时间: 2024-08-19 22:43:12

再次

请输入代号: 测试1
代号 '测试1' 已存在。
是否要为该代号创建新记录?(是/否): 是
生成的随机字符: VK47MD
记录时间: 2024-08-19 22:41:16

取消

请输入代号: 测试1
代号 '测试1' 已存在。
是否要为该代号创建新记录?(是/否): 否
操作已取消,不会创建新记录。

新建

请输入代号: 测试2
生成的随机字符: GYHKKu
记录时间: 2024-08-19 22:43:12

JSON预览

测试1、测试2可看作文章名

{
    "测试1": [
        {
            "random_string": "grdUvO",
            "timestamp": "2024-08-19 22:41:05"
        },
        {
            "random_string": "VK47MD",
            "timestamp": "2024-08-19 22:41:16"
        }
    ],
    "测试2": [
        {
            "random_string": "GYHKKu",
            "timestamp": "2024-08-19 22:43:12"
        }
    ]
}

后记

不覆盖记录是为了方便后悔,我的历史记录可不能随便删。

0

评论区