实现简单的登录注册功能

1.常用系统模块

1.1 os模块

1
import os

1.1.1 os.getcwd() - 获取当前工作目录

1.1.2 os.listdir(文件夹路径) - 获取指定文件夹所有文件名称

1.1.3 os.path.abspath(文件夹路径) - 返回指定文件的绝对路径

1.2 time模块

1
import time

1.2.1 time.time() - 获取当前时间

1
print(time.time())  ## 1627611752.606797 以时间戳显示

时间戳 - 用指定时间到1970年1月1日0时0分0秒(格林威治时间)的时间差来表示时间的方式(秒)

格林威治时间和北京时间有8小时时差 - 现在格林威治时间比北京时间晚8小时

1.2.2 time.localtime() - 获取当前时间的本地时间

1.2.3 time.localtime(时间戳) - 将时间戳对应的时间转换成本地时间

1
2
print(time.localtime())
print(time.localtime(1627611752.606797))

1.2.3 time.sleep(时间) - 程序休眠指定时间(秒)

1.2.4 time.strftime(时间格式,结构体时间) - 结构体时间转字符串时间

1
2
3
4
5
6
7
8
9
10
11
12
13
XXXX年XX月XX日 xx:xx:xx
%Y - 年
%m - 月
%d - 日
%H - 时(24小时制)
%I - 时(12小时制)
%M - 分
%S - 秒
%p - AM、PM(上午、下午)
%a - 星期英文单词缩写
%A - 星期英文单词全拼
%b - 月份英文缩写
%B - 月份英文全拼
1
2
3
4
5
6
7
8
9
t1 = time.localtime()
result = time.strftime('%Y年%m月%d日 %H:%M:%S', t1)
print(result) # 2021年07月30日 10:54:35

result = time.strftime('%Y-%m-%d %H:%M:%S', t1)
print(result)

result = time.strftime('%m月%d日 %p%I:%M %B', t1)
print(result)

1.2.5将字符串时间转换成结构体时间

time.strptime(字符串时间,时间格式)

1
2
3
t3 = time.strptime('2010-10-2', '%Y-%m-%d')
print(f'周{t3.tm_wday + 1}')
print(t3)

1.2.6将字符串时间转换成时间戳(先将字符串时间转换成结构体时间)

time.mktime(结构体时间) - 将结构体时间转换成时间戳

1
2
result = time.mktime(t3)
print(result)

1.3datetime类型 - 处理包含年月日时分秒的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 1)创建datatime时间对象
import datetime
from datetime import datetime, timedelta

# datetime(year, month, day, hour=0, minute=0, second=0)
t1 = datetime(2010, 10, 2)
print(t1) # 2010-10-02 00:00:00

t2 = datetime(2011, 9, 4, 11, 13, 40)
print(t2) # 2011-09-04 11:13:40

# 2)获取时间属性
# 时间对象.year、时间对象.moth、...
print(t2.month) # 9
print(t2.hour) # 11

# 3)获取当前时间
t3 = datetime.now()
print(t3)

# 4)将datetime转换成结构体时间
t4 = t3.timetuple()
print(t4)

# 5)将datetime转换成字符串时间
st5 = t3.strftime('%Y年%m月%d日 %a')
print(st5)

# 6)将字符串时间转换成datetime
str6 = '2003-7-1'
t5 = datetime.strptime(str6, '%Y-%m-%d')

# 2.timedelta - 主要用于时间的加减操作
t6 = t5 + timedelta(days=45)
print(t6) # 2003-08-15 00:00:00

t7 = t5 - timedelta(days=8)
print(t7) # 2003-06-23 00:00:00

t8 = t5 + timedelta(days=1, hours=5, minutes=15)
print(t8) # 2003-07-02 05:15:00

1.4 hashlib模块 - 用于生成数据的hash摘要

1
2
3
4
5
hash 加密算法主要有:md5 和 shaxxx
1. hash加密的特点
a.不可逆(通过原数据加密后无法还原)
b.相同的数据通过相同的算法产生的摘要(密文)是一样的
c.不同大小的数据在使用相同的算法产生的摘要的长度一致

1.4.1使用hashlib产生数据的摘要

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib
## 1.根据算法创建hash对象 - hashlib.算法名()
hash1 = hashlib.md5()

## 2.添加数据
## hash对象.update(二进制数据)

pw = '123456'
hash1.update(pw.encode())

## 3.获取摘要
result = hash1.hexdigest()
print(result)

python二进制数据类型 - bytes

1
2
3
4
5
6
7
8
9
字符串和bytes的相互转换
1)str -> bytes
方法1bytes(字符串,'utf-8')
方法2b'字符集'
方法3:字符串.encode()

2)bytes -> str
方法1str(二进制数据,'utf-8')
方法2:二进制数据.decode()
1
2
3
4
5
6
7
8
9
10
print(bytes('abc','utf-8'))

b1 = b'abc'
print(type(b1))

str1 = 'abc'
print(str1.encode())

print(str(b1,'utf-8'))
print(b1.decode())

2.文件操作

2.1数据的存储

1
2
3
4
程序中保存的数据默认都是存储在运行内存中,运行内存中的数据在程序结束之后会被释放
保存数据需要将数据存储到磁盘中
将数据存储到磁盘的过程又叫数据本地化
数据本地化的基本原理 - 将数据通过文件存储到磁盘中

2.2操作文件内容

1
2
3
文件操作主要解决两个问题:
a.怎么将程序中的数据通过文件存储到磁盘中
b.怎么在程序中使用保存在文件中的数据

2.2.1 文件操作的基本步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
第一步:打开文件
open(文件路径,读写模式,编码方式encoding=文件编码方式)
1.文件路径 - 文件在计算机中的位置信息,以字符串的方式提供值(绝对路径,相对路径)
绝对路径 - 文件在计算机中的全路径
相对路径 - ./(当前目录) 当前项目所在目录
2.读写模式 - 设置打开文件之后是读操作还是写操作,设置操作数据的类型是字符串还是二进制
"""
r - 只读 w - 只写(覆盖原有文件) a - 只写(对数据追加)
t - 按字符串数据类型操作(t可以省略) b - 按二进制数据类型操作
"""
3.encoding - 文件编码方式 以b的方式打开文件的时候encoding不赋值
注意:二进制文件只能以b的方式打开
第二步:文件操作
文件对象.read() - 从读写位置开始到文件结尾(默认为文件开头)
文件对象.readline() - 从读写位置开始读到一行的结尾(只有文本文件有效)
文件对象.readlines() - 以列表形式返回一个对象,每个元素是一行数据
文件对象.write(数据) -
第三步:文件关闭
文件对象.close()
1
2
3
4
f = open(r'E:\\qianfeng1.txt','r+',encoding='utf-8')
print(f.read())

f.seek(0) - 设置读写位置到文件开头

数据持久化的基本步骤:

1
2
3
4
5
第一步:确定需要持久化的数据(确定哪个数据在下一次程序运行的时候还要用)
第二步:创建文件保存数据初始值
第三步:在程序中需要这个数据的时候从文件中读数据
第四步:如果数据发生改变,要将最新的数据写回文件中

练习1:打印程序运行次数

1
2
3
4
5
6
7
f = open(r'E:\shujuchijiu\aa.txt','r',encoding='utf-8')
count = int(f.read())
count+=1
print(count)
f = open(r'E:\shujuchijiu\aa.txt','w',encoding='utf-8')
f.write(str(count))
f.close()

练习2:添加学生,并且在添加完成后显示所有学生信息(只需要学生名字)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
请输入学生姓名: 小明
小明 ['小明']

请输入学生姓名:小花
小明 小花 ['小明', '小花']

请输入学生姓名:q
(程序结束)

请输入学生姓名: 张三
小明 小花 张三 ['小明', '小花', '张三']

请输入学生姓名: 李四
小明 小花 张三 李四 ['小明', '小花', '张三', '李四']

请输入学生姓名:q
(程序结束)
1
2
3
4
5
6
7
8
9
10
11
12
while True:
name = input("请输入学生姓名:")
if name == 'q':
exit()
else:
f = open(r'E:\shujuchijiu\bb.txt', 'r', encoding='utf-8')
all_student = eval(f.read())
all_student.append(name)
print(all_student)
f = open(r'E:\shujuchijiu\bb.txt', 'w', encoding='utf-8')
f.write(str(all_student))
f.close()

作业

控制台登陆注册操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
def login_info():
print('='*50)
print(' '*2 ,'** ','欢迎来到X管理系统',' **')
print()
print()
print(" " * 10, '1.登陆')
print(" " * 10, '2.注册')
print(" " * 10, '3.退出')
print("=" * 50)
xuanze()

def xuanze():
a = int(input("请选择1-3:"))
if a == 1:
login1()
elif a == 2:
zhuce1()
elif a == 3:
f1.close()
f2.close()
print("结束退出")
exit()
else:
print("输入有误将返回")
login_info()

f1 = open(r'E:\shujuchijiu\zhanghao.txt', 'r', encoding='utf-8')
all_zhanghao = eval(f1.read())
f2 = open(r'E:\shujuchijiu\mima.txt', 'r', encoding='utf-8')
all_mima = eval(f2.read())


def zhuce1():
global all_zhanghao
global all_mima
zhanghao = input("请输入账号(3-6位):")
if not 3 <= len(zhanghao) <=6:
print("用户名格式错误")
zhuce1()
mima = input("请输入密码(6-12位)")
if not 6 <= len(mima) <=12:
print("密码格式错误")
zhuce1()
if zhanghao in all_zhanghao:
print("注册失败,该账号已经注册过!")
login_info()
else:
all_zhanghao.append(zhanghao)
all_mima.append(mima)
f1 = open(r'E:\shujuchijiu\zhanghao.txt', 'w', encoding='utf-8')
f1.write(str(all_zhanghao))
f2 = open(r'E:\shujuchijiu\mima.txt', 'w', encoding='utf-8')
f2.write(str(all_mima))
print("注册成功")
login_info()


def login1():
global all_zhanghao
global all_mima
zhanghao = input("请输入账号:")
mima = input("请输入密码:")
if zhanghao not in all_zhanghao:
print("该账号未注册")
login_info()
elif mima not in all_mima:
print("登陆失败,密码错误")
login_info()
else:
if mima != all_mima[all_zhanghao.index(zhanghao)]:
print("登陆失败,密码错误")
login_info()
else:
print("登陆成功")
login_info()

login_info()