做完毕业设计准备答辩啦,分享一下我的毕业设计作品的源码٩(ˊᗜˋ*)و

技术太烂,毕设只能选最简单的题目了,不会GUI也懒得学,所以就连GUI都没有


题目


我做的:帮助菜单、待抽已抽列表输出、添加数据(手动输入/txt文件/csv文件)、批量抽取、重置(已抽列表重新回到待抽列表)、导出数据(txt文件/csv文件)
演示
演示


程序

源码

下载:

预览:

源码预览

# -*- coding: utf-8 -*-
# @Author        : Doraemon!
# @Time          : 2023/6/23 20:19
# @Function      : 从文件或手动添加的方式导入抽签列表,随后抽签并剔除抽到的人员后续不会再抽到,导出数据
# @Website       : https://blog.ldora.cn

import random
import pandas as pd

daichou = []  # 待抽列表
yichou = []  # 已抽列表
daichou1 = []  # 导入文件时用的
yichou1 = []  # 导入文件时用的
badchars = "\n&;|'\"$()`-"  # 过滤危险操作用的
print("启动!使用'/帮助'查看帮助")
run = 1  # 用于进入下面的命令输入循环
while (run == 1):
    in1 = input(">")  # 要求用户输入命令,赋值到in1
    if in1 == "/帮助":  # 当用户输入“/帮助”时
        print("/列表:查看等待抽取、已被抽取列表\n/清空:清空待抽、已抽列表\n/重置:将已抽列表的元素重新放回待抽列表\n/添\
加:通过手动、从文件导入等方式将内容添加到待抽列表(导入文件的内容格式请参考导出后的格式)\n/抽取:从待抽列表抽取\n\
/导出:将待抽、已抽列表导出到txt或csv文件里\n/退出:程序结束运行")
        continue

    if "/添加" in in1:  # 如果用户输入包括“/添加”/
        if "/添加 -c " in in1:  # 如果用户输入包括“/添加 -c”
            if len(in1) > len("/添加 -c "):  # 判断“/添加 -c”后面是否输入了文件地址
                try:  # 对读取文件做错误处理
                    # 读取用户输入的文件,使用字符串,清除初始空格(起到过滤只有空格的元素的作用)
                    df = pd.read_csv(in1[8:-1],
                                     dtype=str,
                                     skipinitialspace=True)
                except UnicodeDecodeError:  # 如果报错为UnicodeDecodeError的输出
                    print("文件编码格式错误,请将文件保存为UTF-8编码后再进行导入操作")
                except FileNotFoundError:  # 如果报错为FileNotFoundError的输出
                    print("文件不存在,请检查输入的文件位置是否正确")
                else:
                    # 将daichou1和yichou1两个列表从导入的数据里赋值,去除空元素,转成列表
                    daichou1 = df["待抽"].dropna(how="all").tolist()
                    yichou1 = df["已抽"].dropna(how="all").tolist()
                    # 将daichou1和yichou1里面的所有元素进行命令执行函数字符的过滤并添加到daichou和yichou列表
                    for a in daichou1:
                        for char in badchars:
                            a = a.replace(char, "")
                        daichou.append(a)
                    for a in yichou1:
                        for char in badchars:
                            a = a.replace(char, "")
                        yichou.append(a)
                    print("已执行导入操作,如需查看待抽列表,请输入\"/列表\"")
                continue
            else:
                print("文件地址为空")
                continue
        elif "/添加 -t " in in1:  # 如果用户输入包括“/添加 -t”
            if len(in1) > len("/添加 -t "):  # 判断“/添加 -t”后面是否输入了文件地址
                try:  # 对读取文件做错误处理
                    f = open(in1[8:-1], "r", encoding="utf-8")  # 打开文件,编码utf-8
                except UnicodeDecodeError:  # 如果报错为UnicodeDecodeError的输出
                    print("文件编码格式错误,请将文件保存为UTF-8编码后再进行导入操作")
                except FileNotFoundError:  # 如果报错为FileNotFoundError的输出
                    print("文件不存在,请检查输入的文件位置是否正确")
                else:
                    for line in f:  # 循环导入列表
                        line = line.strip()  # 去除文件的换行符
                        if line.startswith("待抽"):  # 如果以待抽开头
                            daichou1 = line.split("=")[1]  # 用等号分割,取等号后面的
                            for char in badchars:  # 导入到变量前先在这个循环里边过滤命令执行函数的字符
                                daichou1 = daichou1.replace(char, "")
                            daichou1 = daichou1.split(",")  # 使用逗号分割
                        elif line.startswith("已抽"):  # 如果以已抽开头
                            yichou1 = line.split("=")[1]  # 用等号分割,取等号后面的
                            for char in badchars:  # 导入到变量前先在这个循环里边过滤命令执行函数的字符
                                yichou1 = yichou1.replace(char, "")
                            yichou1 = yichou1.split(",")  # 使用逗号分割
                    f.close()  # 关闭文件
                    # 将daichou1和yichou1添加到daichou和yichou
                    daichou.extend(daichou1)
                    yichou.extend(yichou1)
                    print("已执行导入操作,如需查看待抽列表,请输入\"/列表\"")
                continue
            else:
                print("文件地址为空")
                continue
        elif len(in1) > len("/添加 "):  # 如果用户输入“/添加 ”并不包括-f参数,并且内容不为空
            if "/" in in1[4:]:  # 如果用户希望批量添加
                in1 = in1[4:]  # 将输入的头“/添加 ”去除,取内容
                in1 = in1.split("/")  # 将in1的内容使用“/”符号进行分割,并将分割后的列表赋值给in1
                daichou = [x for x in in1
                           if x.strip()]  # 将in1列表添加到daichou列表中,且将空值或只有空格的元素删除
                a = ""  # 搞个a变量,用于下面这个循环中存放本次请求添加的数据使用字符串输出
                for i in in1:
                    if i != "" and i.isspace() is False:
                        a = a + i + "/"
                    else:
                        continue
                print("已将 " + a[:-1] + " 添加到待抽列表,如需查看待抽列表,请输入\"/列表\"")
                continue
            else:
                daichou.append(in1[4:])  # 将内容添加到列表daichou
                print("已将 " + in1[4:] + " 添加到待抽列表,如需查看待抽列表,请输入\"/列表\"")
                continue
        else:  # 没有内容则输出用法
            print("用法:/添加 [-c|-t] [文件位置/内容]\n例1(导入csv文件):/添加 -c \"D:\\\
1.csv\"\n例2(导入txt文件):/添加 -t \"D:\\1.txt\"\n例3(手动添加):/添加 张三\n例4(手动多个):/添加 小黑子/\
大黑子/巨大黑子")
            continue

    if "/抽取" in in1:  # 如果输入内容包含“/抽取”
        if len(in1) > len("/抽取 "):  # 如果输入内容带有参数
            choushu = int(in1[4:])  # 取用户输入的抽取次数
            if choushu <= 0:  # 如果输入的抽取次数小于等于0则输出提示
                print("输入错误,请重新输入0以上的整型")
                continue
            elif choushu > len(daichou):  # 如果输入的抽取次数大于待抽列表数量则输出提示
                print("输入错误,当前输入的值大于待抽列表元素数量,当前待抽列表共有" + str(len(daichou)) +
                      "个元素")
                continue
            else:  # 否则正常执行
                daichoutype = ""  # 用于抽完后剩余待抽的文本输出
                yichoutype = ""  # 用于抽完后抽取到的文本输出
                for i in range(choushu):  # 循环抽取
                    num = random.randint(0, len(daichou) - 1)  # 随机一个数
                    yichou.append(
                        daichou[num])  # 将随机数作为daichou的索引将其元素添加到yichou中
                    del daichou[num]  # 从daichou列表删除这个已经被抽的元素
                for ys in daichou:  # 抽取完毕,转为字符串输出
                    daichoutype = daichoutype + ys + ","
                for ys in yichou:  # 抽取完毕,转为字符串输出
                    yichoutype = yichoutype + ys + ","
                print("抽取完成,结果如下\n待抽:" + daichoutype[:-1] + "\n已抽:" +
                      yichoutype[:-1])
                continue
        else:  # 用户只输入了命令没有输入数值则输出用法
            print("用法:/抽取 [次数]\n例(抽取5个):/抽取 5")
            continue

    if "/列表" in in1:  # 如果用户输入为“/列表”
        daichoutype = ""  # 加个变量用于下方格式化输出
        yichoutype = ""  # 加个变量用于下方格式化输出
        for ys in daichou:  # 将待抽列表,转为字符串输出
            daichoutype = daichoutype + ys + ","
        for ys in yichou:  # 将已抽列表,转为字符串输出
            yichoutype = yichoutype + ys + ","
        print("当前列表:\n待抽:" + daichoutype[:-1] + "\n已抽:" + yichoutype[:-1])
        continue

    if "/清空" in in1:  # 如果用户输入为“/清空”则将daihcou和yichou列表清空
        daichou = []
        yichou = []
        print("已将待抽及已抽列表清空")
        continue

    if "/退出" in in1:  # 将run=0退出循环,结束运行
        print("程序将结束运行")
        run = 0
        continue

    if "/导出" in in1:  # 如果用户输入包含“导出”
        if daichou != [] or yichou != []:  # 判断待抽和已抽列表是否为空
            if "/导出 -t" in in1:  # 判断参数是否为-t
                if len(in1) > len("/导出 -t "):  # -t后面是否为空
                    str_daichou = ",".join(
                        daichou
                    )  # 给daichou列表每个元素用逗号分隔,并作为字符串赋值给str_daichou,用于后续保存文件
                    str_yichou = ",".join(
                        yichou
                    )  # 给yichou列表每个元素用逗号分隔,并作为字符串赋值给str_yichou,用于后续保存文件
                    try:  # 对导出文件进行错误处理
                        file = open(
                            in1[8:-1], "w",
                            encoding="utf-8")  # 在用户输入的文件位置上打开文件,如果没有则创建一个
                    except PermissionError:  # 对PermissionError错误的输出
                        print("导出失败!操作目录权限不足,请重新进行导出操作")
                    else:
                        file.writelines("待抽=" + str_daichou + "\n" + "已抽=" +
                                        str_yichou)  # 将结果写入文件
                        file.close()  # 关闭并保存文件
                        print("已将结果保存到:" + in1[8:-1])
                    continue
                else:
                    print("文件地址为空")
                    continue

            if "/导出 -c" in in1:  # 判断参数是否为c
                if len(in1) > len("/导出 -c "):  # 判断-c后面是否为空
                    df1 = pd.DataFrame(daichou,
                                       columns=["待抽"])  # 将列表转为数据框,列名为待抽
                    df2 = pd.DataFrame(yichou,
                                       columns=["已抽"])  # 将列表转为数据框,列名为已抽
                    df = pd.concat([df1, df2],
                                   axis=1)  # 合并上俩数据框,并且使用新的索引值(确保每列是从顶头开始)
                    try:  # 对导出文件进行错误处理
                        df.to_csv(in1[8:-1],
                                  header=True,
                                  index=False,
                                  encoding="utf-8-sig"
                                  )  # 将其保存到指定位置,显示列名,关闭索引值,设置编码utf-8-sig
                    except PermissionError:  # 对PermissionError错误的输出
                        print("导出失败!操作目录权限不足,请重新进行导出操作")
                    else:
                        print("已将结果保存到:" + in1[8:-1])
                    continue
                else:
                    print("文件地址为空")
                    continue

            # 如果没有匹配到-c或者-t参数,则在下面输出用法
            print(
                "用法:/导出 [-c|-t] \"[文件位置]\"\n-t:导出文件为txt格式\n-c:导出文件为csv格式\n例1:\
/导出 -c \"C:\\1.csv\"\n例2:/导出 -t \"C:\\1.txt\"")
            continue
        else:
            print("待抽及已抽列表为空,无数据需要导出")
            continue

    if "/重置" in in1:  # 如果用户输入为“/重置”
        daichou.extend(yichou)  # 将yichou列表重新添加回daichou列表
        yichou = []  # 清空yichou列表
        print("已抽数据已重置")
        continue

    print("无效命令,需要帮助请使用:/帮助")

成品

我已经将上面的代码打包成exe文件啦,方便浅浅试用一下
下载:


结束

代码仅供参考,禁止复制粘贴抄袭行为(应该也不会有人抄这破玩意),最后希望大家都能顺利毕业
关于上面的破代码有任何问题欢迎在评论区讨论,如需转载请注明来自叮当窝(https://blog.ldora.cn)

Last modification:July 16, 2023
如果喜欢,打赏几分钱呗:)