day14-hash加密以及文件操作

总结

1. hashlib模块

  • hash摘要(加密)的算法主要有两类:md5和sha-X系列

  • hash加密

    """
    1) hash摘要算法生成的摘要不可逆。(不能通过密文来获取原文)
    2) 只用相同的数据通过相同的算法得到的摘要才是一致的。
    3) 不管原数据多大,产生的摘要的大小(长度)是一致的。
    """
    
    • 生成hash摘要

      """
      1) 通过算法创建hash对象: hashlib.算法名()
      # 算法名: md5、 shaXXX
      """
      
      import hashlib
      
      hashmd5 = hashlib.md5()
      hashsha = hashlib.sha256()
      
    • 添加数据

      # hash对象.update(数据)
      # 注意:数据必须是二进制, 类型是bytes
      
      # 补充:二进制和字符串之间的相互转换
      """
      字符串转二进制:
      bytes(字符串, encoding='utf-8'
      字符串.encode()        # 编码
      
      二进制转字符串:
      str(二进制, encoding='utf-8')
      二进制.decode()        # 解码
      """
      
      hashmd5.update(bytes("123456", encoding='utf-8'))
      print(hashmd5)
      hashmd5.update("123456".encode())
      hashsha = hashlib.sha256('123456'.encode())
      
    • 获取摘要

      # hash.hexdigest()
      result = hashmd5.hexdigest()
      print(result)       # ea48576f30be1669971699c09ad05c94
      print(hashsha.hexdigest())
      
      
      hashsha.update("""pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。
      
      目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。
      
      Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。""".encode())
      
      result = hashsha.hexdigest()
      print(type(result))
      

2. 数据持久化

  • 什么是数据持久化

    """
    程序中保存的数据默认都是保存在运行内存中的,在程序运行结束的时候都会被释放。
    如果希望这次运行程序产生的数据在下一次运行程序的时候还能用,就需要将数据保存到硬盘中()
    
    将数据保存到硬盘的过程就是数据持久化的过程。
    硬盘保存数据的基本单位是文件,所以如果要将数据保存到硬盘中,只需要将数据保存在文件中。
    
    程序中数据持久化的常用类型:数据库文件(.db、.sqilte等)、plist文件、json文件、txt文件、
                            二进制文(图片、音频、exe可执行文件)
    
    """
    
  • 文件操作 - 操作文件内容

    • 打开文件

      """
      open(file, mode='r', *, encoding=None)  -   已指定方式打开指定文件,返回一个文件对象
      
      a) file    -   需要打开的文件在计算机中的位置信息(文件路径)
                     绝对路径:文件在计算机中的全路径(一般从盘开始写) r'D:\Qianfeng-Python-2103\PycharmProjects\day14'
                     相对路径:.  -  表示当前目录(运行程序文件所在的路径)
                             .. -  表示当前目录的上级目录
                             ...  -   表示当前目录的上层目录的上层目录
                             
      b) mode     -   文件打开方式,决定打开该文件后能继续对文件能进行的操作以及操作的类型
                      第一组:'r'、'w'、'a' -   控制后续操作(是读是写)
                      第二组:'t'、'b' -   控制操作数据的类型
                      第一组必须选一个,第二组可以不选,不选默认是t
                      ’r' -   只读
                      'w' -   只写,会清空原文件
                      'a' -   只写,会保留源文件内容
                      
                      第二组:'t'、'b' -   控制操作数据的类型
                      't':    -   读操作返回的数据和写操作写入的数据是字符串(str)
                      ’b':    -   读操作返回的数据和写操作写入的数据是二进制(bytes)
                      
                      注意:1.二进制文件打开的时候必须带b
                      
      c) encoding -   文本文件的编码方式(需要保证写入数据采用的什么方式进行编码读数据的时候就
                      需要对应的方式解码)
                      一般采用utf-8, 但是很多windows文本默认编码方式是gbk
                      注意:只有在以t的方式打开文本文件的时候才需要考虑给encoding赋值
      """
      
      # open(r'.\tes.txt')      # FileNotFoundError: [Errno 2] No such file or directory: '.\\tes.txt'
      # open(r'D:\Qianfeng-Python-2103\PycharmProjects\day14\text.txt')
      # f = open(r'.\text.txt', 'rb')
      # text = f.read()
      # print(text.decode(), type(text))
      #
      # f.close()
      #
      # f = open(r'.\text2.txt', 'rb')
      #
      # text = f.read()
      # print(text, type(text))
      
    • 操作文件

      # a. 读操作
      """
      文件对象.read() -   从读写位置开始,读到文件结束。(读写位置到文件结尾)
      """
      
      with open(r'./text.txt', encoding='utf-8') as f:
          print(f.read())         # 床前明月光,...
          f.seek(0)       # 将读写位置移动到文件开头
          print(f.read())     # 床前明月光,...
      
      with open(r'./text.txt', encoding='utf-8') as f:
          text = f.readline()
          while text:
              print(text, end='')
              text = f.readline()
      
          f.seek(0)
          print(f.readlines())        # ['床前明月光,\n', '疑是地上霜。\n', '举头望明月,\n', '低头思故乡。']
      
      # b. 写操作
      # 文件对象.write(数据)    -   将数据写入到指定文件中
      
      with open(r'.\text.txt', 'ab') as f:
          f.write('abc'.encode())
      
      with open(r'.\text.txt', 'a', encoding='utf-8') as f:
          f.write('abc')
      
    • 关闭文件

      # 文件对象.close()
      # f.close()
      
  • eval函数

    result = eval('100')
    print(result, type(result))       # 100 <class 'int'>
    
    result = eval('10.43')
    print(result, type(result))       # 10.43 <class 'float'>
    
    result = eval('[10, 23, 43, 23]')
    print(result, type(result))     # [10, 23, 43, 23] <class 'list'>
    
    result = eval("10 if True else 18")
    print(result)       # 10
    

作业

# homework.py

import hashlib


def login_page():
    print("".center(40, '='))
    print("学生管理系统登录页面".center(30, ' '))
    print()
    print("❀  1. 登     录".center(33, ' '))
    print("❀  2. 注     册".center(33, ' '))
    print("❀  3. 退     出".center(33, ' '))
    print()
    print("".center(40, '='))


def login():
    name = input('请输入用户名:')
    pwd = input('请输入密码:')
    hash_pwd = hashlib.md5()
    hash_pwd.update(pwd.encode())
    userinfos = get_userinfo()
    for info in userinfos:
        if info['name'] == name and info['pwd'] == hash_pwd.hexdigest():
            return True
    return False


def register():
    name = input('请输入用户名:')
    pwd = input('请输入密码:')
    userinfos = get_userinfo()
    for info in userinfos:
        if info['name'] == name:
            return False
    hashpwd = hashlib.md5()
    hashpwd.update(pwd.encode())
    userinfos.append({'name': name, 'pwd': hashpwd.hexdigest()})
    save_userinfo(userinfos)
    return True


def get_userinfo() -> list:
    f = open(r'./useinfo.txt', 'rb')
    text = f.read().decode()
    # users = eval(text)
    users = json.loads(text)		# 改json数据格式
    f.close()
    return users


def save_userinfo(userinfos: list):
    f = open(r'./useinfo.txt', 'wb')
    # f.write(str(userinfos).encode())
    json_str = json.dumps(userinfos)
    f.write(json_str.encode())
    f.close()
# homeworkMain.py

from homework import *
from datetime import datetime
import time

is_login = False
login_time = None

while True:
    login_page()
    choice = input('请选择:')
    if choice == '1':
        if login():
            print('登录成功!')
            is_login = True
            login_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            break
        else:
            print('登录失败!')
    elif choice == '2':
        if register():
            print('注册成功!')
        else:
            print('注册失败!')
    elif choice == '3':
        print('退出系统...')
        break

if is_login:
    print('正在进入用户界面...')
    time.sleep(3)

useinfo.txt

[]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值