day14_异常捕获和文件操作

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('密码错误!')
上一篇:java学习day14---(多态)


下一篇:Java-day14-常用API01