栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

小白向大佬迈进的第一天![自制Json数据库 | 01]

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

小白向大佬迈进的第一天![自制Json数据库 | 01]

大家好,我是一只野生的Python小白呀! 初入CSDN,想和大家一起分享一下自己的学习过程和一些经验。

        好了,废话不多说,下面步入正题。

        这两天突然突(闲)发(着)奇(没)想(事),想自己做一个数据库。

       众所周知,JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。所以,JSON就是我们储存数据的主要方式了。

        但是呢,JSON中的数据不能直接读、写,所以我们先来写两个函数:

import json#json解析
import os#数据读写,文件操作
import sys#控制退出
import time#控制暂停
import shutil#文件夹操作



def saveToJSON(dicObject,file):
    flag=False
    '''#这一段注释掉了,因为后面发现这样不能完全满足使用需求。
    if type(dicObject)!=dict:
        print('dict')
        return flag
    '''
    try:
        j_file=open("./PyDB/"+file,'a')#打开文件,PyDB是储存数据的文件夹,后面会说到
        json.dump(dicObject,j_file,ensure_ascii=False)#以JSON格式储存数据
        flag=True
    except:
        print('写数据出错!')
    finally:
        if flag:
            j_file.close()
    return flag
#=========================
def GetFromJSON(filename):
    flag=False
    dicObject={}
    try:
        way="./PyDB/"+filename#文件路径
        j_file=open(way,'r')#以只读方式打开文件
        dicObject=json.load(j_file)#使用json的load方法解析数据
        flag=True
    except:
        flag=False
    finally:
        if flag:
            j_file.close()
        elif flag==False:
            return False
    return dicObject

        写的不是很好啊,大佬轻点喷QAQ 

        这样,我们就可以进行json文件的读写操作了。不过这样子有一个很大的弊端,那就是当json文件中有多个字典数据时,就无法正常的读写了。那将所有字典数据放在一个表格呢?这下可以存放多个字典数据了,但当json文件中有多个表格时,还是无法正常读出。

        所以,我们把GetFromJSON换成这个:

def turn(file):
    with open(file,mode='r',encoding='utf-8') as f:#用with语句打开文件
        a=f.readline()#将文件以字符串形式读出
        a=a.split('","')#以“,”为间隔,将字符串分割成表格
        b=[]#返回的列表
        for i in range(len(a)):
            if i <= len(a)-2:#a的结尾会有一个‘“,”’,需要把它去掉
                b.append(json.loads(a[i]))#用json解析字符串并添加到列表中
        return b

        这下可以比较方便的读写数据了。所以,刚才才要把判断数据是否为字典类型去掉。再写入完数据后可以在后面写入一个“,”,方便读取。

        接下来就是主程序了,我的大致想法是用两个大循环,一个控制登陆,一个控制数据操作。

        接下来,上代码!

if __name__ == '__main__':
    print("| Welcome to PyDB Monitor.")#一些简要信息
    print("| Server version: 1.0.0 PyDB Server.")
    print("| Add '@' at the beginning of the statement.")
    print("| Type '@help' or '@h' for help.Type '@continue' or '@c' to clear the current input statement.n")
    print("PyDB>Welcome to PyDB!"+"n")#欢迎语句
    folder=''#判断是否存在数据库文件夹
    for i in range(len(os.listdir())):
        a=os.listdir()
        if a[i]=='PyDB':
            folder='PyDB'
    if folder!='PyDB':#如果没有,则创建数据库文件夹
        os.makedirs('./PyDB'+'./user')
        os.makedirs('./PyDB'+'./Database')

        开头的判断十分重要,不然会影响到后面所有的数据操作!

        接下来是第一个大循环:

    #----------------------------------------------------登录
    while True:

        if len(os.listdir('./PyDB/user'))==0:#判断是否存在用户,如果没有,则创建一个超级管理员
            print("PyDB> There are no users yet :( ...  Let's create one! :) n")
            admin=input("PyDB>  Please enter your User Name!nAdministrator>")
            Pass=input("PyDB> Please enter your password!nPassword>")
            RePass=input("PyDB> Please enter your password again!nPassword>")
            if Pass==RePass:#判断两次输入的密码是否一致
                #用户信息
                info={
                    'Name':admin,'Password':Pass,'Jurisdiction':'Root'
                }
                saveToJSON(info,'user/'+admin+'.json')#储存信息
                print("nSuccess>Congratulations, account creation succeeded!n")
                host=GetFromJSON("user/"+admin+".json")#为后面的一些判断做准备
                os.makedirs('./PyDB'+'./Database'+'./'+admin)#在数据库文件夹下创建用户文件夹
                break#跳出循环,进行数据操作
            else:#不一致则进入另一个循环
                while True:
                    print('PyDB>The two passwords you entered are different. Please try again.')
                    Pass=input("PyDB> Please enter your password!nPassword>")
                    RePass=input("PyDB> Please enter your password again!nPassword>")
                    if Pass==RePass:
                        info={
                            'User':admin,'Password':Pass,'Jurisdiction':'Root'
                        }
                        saveToJSON(info,'user/'+admin+'.json')
                        print("nSuccess>Congratulations, account creation succeeded!n")
                        host=GetFromJSON("user/"+admin+".json")
                        os.makedirs('./PyDB'+'./Database'+'./'+admin)
                        break
                    break
        else:#如果存在用户,则进行登录操作
            while True:
                admin=input('User name>')
                if admin=="@exit":#若需退出,则可以在此退出
                    print("PyDB>Thank you for your use~ :) Bye!")
                    time.sleep(3)
                    sys.exit()
                if GetFromJSON("user/"+admin+".json")==False:#判断该用户是否存在
                    print("Error>Sorry, there is no such user.Please try again.")
                else:
                    host=GetFromJSON("user/"+admin+".json")#获取用户信息
                    break
            Pass=input('Password>')#用户密码
            if Pass=="@exit":#若需退出,则可以在此退出
                print("PyDB>Thank you for your use~ :) Bye!")
                time.sleep(3)
                sys.exit()
            if host["Password"]!=Pass:#若三次密码错误,则退出程序
                print("Error>Password error, please try again!")
                Pass=input('Password>')
                host=GetFromJSON("user/"+admin+".json")
                if host["Password"]!=Pass:
                    print("Error>Password error, please try again!")
                    Pass=input('Password>')
                    host=GetFromJSON("user/"+admin+".json")
                    if host['Password']!=Pass:
                        print("Error>You have made three consecutive errors. Please try again later.")
                        time.sleep(3)
                        sys.exit()
                    else:
                        print("n"+"PyDB>Welcome,"+admin+'!n')
                        break
                else:
                    print("n"+"PyDB>Welcome,"+admin+'!n')
                    break
            else:
                print("n"+"PyDB>Welcome,"+admin+'!n')
                break#进入操作界面

        好了,到此为止,数据库的登陆系统已经制作完成了。后面的功能……下期更新!

        第一次写文章,写的不是很好啊,大佬轻点喷QAQ ……谢谢QwQ

        如果大家有建议,可以在评论区告诉我哈,谢谢!

        Bye~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269709.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号