day14_异常捕获和文件操作
新知识
1.hash
hash摘要(加密)的算法主要有两类:md5和sha-X
1). hash加密的特点
a). hash算法生成的摘要不可逆。不能通过密文来获取原文
b). 只有相同的数据通过相同的算法得到的摘要才是一致的
c). 不管原数据多大,产生的摘要的大小(长度)是一致的
2). 生成hash摘要
a). 通过算法创建hash对象
hash = hashlib.md5()
b). 添加数据
hash对象.update(数据)
注意:数据必须是二进制数据,类型是bytes
hash.update('1122324')
补充:二进制和字符串之间的相互转换
Ⅰ). 字符串转二进制
hash.update(bytes('12133',encoding='utf-8'))
#或者
hash.update('122132'.encode())
Ⅱ). 二进制转字符串
二进制转字符串:
str(二进制,encoding = ‘utf-8’)
二进制.decode()
c.)获取摘要
result = hash.hexdigest()
print(result)
练习: 判断文件内容是否被修改
hash = hashlib.md5()
with open('一个不重要的文件.txt','rb') as f:
hash.update((f.read()))
print(hash.hexdigest())
#改前:2a229651c23d0e17d2379b03b6e00fc0
#改后:3f3a2c3dfd721e6710026c56a6c6803a
等价于
with open('一个不重要的文件.txt','r',encoding='utf-8') as f:
hash.update((f.read().encode()))
print(hash.hexdigest())
文件操作
1. 数据持久化
程序中保存的数据默认都是保存在运存中的,在程序运行结束的时候都会被释放
如果希望这运行程序产生的数据在下一次运行程序的时候还能用,就需要将数据保存到硬盘中
数据持久化 = 将数据保存到硬盘的过程
硬盘保存数据的基本单元是文件,如果要将数据保存到硬盘中,只需要将数据保存到文件中
程序中数据持久化的常用文件类型:数据库文件(.db,.sqlite等)、plist文件、json文件(json文件在网络上的传输效率比xml高,但是xml的安全性更高)、txt文件、二进制文件(图片、视频、音频、exe)
2. 文件操作 - 操作文件的内容
文件操作的基本流程:打开文件 — 操作文件(读、写) — 关闭文件
1)打开文件
open(file=‘一个不重要的文件.txt’,mode=‘r’,encoding=None) - 以指定方式打开指定文件,返回一个文件对象
参数:
a.) file - 需要打开的文件在计算机中的位置信息(文件路径)
路径的本质是字符串
路径分为绝对路径和相对路径
绝对路径:文件在计算机里的全路径,一般从盘开始写
open(r'E:/文档/毕设/毕业设计(论文) .doc')
相对路径: . - 表示当前目录,当前代码文件所在的目录
… - 表示当前目录的上层目录
… - 表示当前目录的上层目录的上层目录
……
open(r'./一个不重要的文件.txt')
open(r'../res/a.txt')
b). mode - 文件打开方式,决定打开文件后后续能对该文件进行的操作以及操作数据的类型
‘r’、‘w’、‘a’ - 控制后续操作(是读还是写)
‘t’、‘b’ - 控制操作数据的类型。默认是t
r,w,a中必须选一个,t,b可以不选,不选的时候默认是t
‘r’ - 只读
‘w’ - 只写,覆盖
‘a’ - 只写,追加
‘t’ - 读操作返回的数据和写操作写入的数据是字符串(str)
‘b’ - 读操作返回的数据和写操作写入的数据是二进制(bytes)
注意:1.二进制文件打开的时候必须带b
c). encoding - 文本文件的编码方式(需要保证写入数据采用的什么方式进行编码,读数据的时候就需要用对应的方式解码)
- 一般采用utf-8 ,但是很多windows文本默认编码方式是gbk
注意:只有在以t的方式打开文本文件的时候才需要考虑给encoding赋值
2)关闭文件
文件对象.close()
f.close()
关闭之后不能再读
3)操作
a) . 读操作
文件对象.read() - 从读写位置开始,读到文件结束,读写位置默认在文件开头
文件对象.readline() - 从读写位置开始,读到一行结束
f = open('./res/a.txt',encoding='utf-8')
print('========')
print(f.read())
print('========')
f.seek(0) # 将读写位置移动到开头
print(f.readline())
f.seek(0)
print(f.readlines()) #返回列表
b). 写操作
文件对象.write(数据) - 将数据写入指定文件中
练习:数据持久化
写一个程序打印程序执行的次数
"""
1)用一个文件来保存需要持久化的数据
2)程序中需要这个数据的时候就从文件中读取这个数据
3)如果数据发生改变,需要把最新的数据再写入文件中
"""
f = open('count.txt',encoding='utf-8')
count = int(f.read())
count += 1
print(count)
f = open('count.txt','w',encoding='utf-8')
f.write(str(count))
c). 补充
eval函数
result = eval('100')
print(result,type(result)) #int
result = eval('[10,20,30]')
print(result,type[result]) #列表
作业
学生管理系统界面
两个py文件,一个装函数,一个主入口
stulogin:装函数
app:主入口
两个txt文件:student_info装学生信息,stu_count装学生数量
"""
Time:2021/5/15 16:26
Author:小李今天敲代码了吗
"""
# app.py
import stulogin
chose = 1
while chose != '3':
stulogin.index()
chose = str(input('请选择:'))
if chose == '1':
stulogin.login()
elif chose == '2':
stulogin.register()
elif chose == '3':
stulogin.logout()
elif chose =='4':
stulogin.dispaly()
else:
print('输入错误!')
"""
Time:2021/5/15 16:10
Author:小李今天敲代码了吗
"""
# stulogin.py
def index():
print('=================================================\n',
'\t\t\t\t学生管理系统登录页面\t\t\t\n',
'\t\t\t\t❀ 1. 登 录\t\t\t\n',
'\t\t\t\t❀ 2. 注 册\t\t\t\n',
'\t\t\t\t❀ 3. 退 出\t\t\t\n',
'\t\t\t\t❀ 4. 显示全部\t\t\t\n',
'================================================='
)
def stunum(): # 记录学生数量
# f = open('stu_count.txt', 'r', encoding='utf-8')
# count = int(f.read())
# count += 1
f = open('stu_count.txt', 'r', encoding='utf-8')
count = int(f.read())
return count
def isrepeat(name): # 判断重复
f = open('student_info.txt', 'r', encoding='utf-8')
for i in range(stunum()):
content = f.readline()
stu_find = eval(content)
# print(stu_find)
if name == stu_find['name']:
print('用户名重复')
f.close()
return False
else:
f.close()
return True
def login():
name = str(input('请输入用户名:'))
password = str(input('请输入密码:'))
stu = {'name': name, 'password': password}
res = str(stu)
f = open('student_info.txt', 'r', encoding='utf-8')
for i in range(stunum()):
content = f.readline()
stu_find = eval(content)
# print(stu_find)
if name == stu_find['name'] and password == stu_find['password']:
print(f'登陆成功!欢迎用户:{name}')
f.close()
return False
else:
print('密码错误/用户不存在,请重新输入!')
f.close()
return True
def register(): # 注册
name = str(input('请输入用户名:'))
password = str(input('请输入密码:'))
if isrepeat(name): # 判断是否重名
stu = {'name': name, 'password': password}
res = str(stu) # 转化成字符串
# print(res)
f = open('student_info.txt', 'a', encoding='utf-8')
f.write(res + '\n') # 写入的时候换行
f.close()
f = open('stu_count.txt', 'r', encoding='utf-8')
count = int(f.read()) # 记录学生数量
count += 1
f = open('stu_count.txt','w',encoding='utf-8')
f.write(str(count))
print(f'注册成功,欢迎用户:{name}')
# 注册
def logout():
print('退出成功')
# 退出
def dispaly():
pw = input('请输入管理员密码:')
if pw == '123456':
f = open('student_info.txt', 'r', encoding='utf-8')
print(f.read()) # 显示学生信息
else:
print('密码错误!')