计算机基础知识24

序列化模块(json)

# 序列就是字符串,序列化是把其他数据类型转为json字符串的过程

# 反序列化:把json字符串转为其他数据类型的过程就是反序列化

       """json字符串 json对象"""

在Python中把其他数据类型转为json需要使用json模块

import json

json模块中与四个方法

json.dumps---->序列化用的
json.loads------》反序列化
json.dump------》序列化,它可以直接写入文件
json.load-----------》它能够读取文件,然后自动反序列化

1. 把字典类型转为json格式的数据

import json
d = {"username":"kevin", 'age':18} # {"username": "kevin", "age": 18}
print(type(d))  # dict
print(json.dumps(d), type(json.dumps(d)))   # <class 'str'> 
"""{"username": "kevin", "age": 18}  json格式的数据特点:字典里面的都变成了双引号"""

2.反序列化:java给你发送了数据------------》

通过网络传输的数据一定是二进制

res = b'{"username": "kevin", "age": 18}'
# 把二进制数据转为Python中得字典
s1 = res.decode('utf-8')   # 二进制解码 {"username": "kevin", "age": 18}
d1 = json.loads(s1)
print(d1['username'])   # 反序列后就可以正常字典取值了
"""字节类型------》字符串-----------》字典"""

3、把字典格式的数据写入到文件中,读数据也是字典

d = {'username':'jerry', 'age':18}
with open('a.txt', 'w', encoding='utf-8') as f:
    f.write(str(d))
    f.write(json.dumps(d))
with open('a.txt', 'r', encoding='utf-8') as f1:
    res=eval(f1.read()) # {'username': 'jerry', 'age': 18}
    print(res, type(res))   # dict
# 非常方便的写入文件
with open('a.txt', 'w', encoding='utf-8') as f:    
    json.dump(d, f)   # 1. 先把数据序列化,2. 把数据write进去
with open('a.txt', 'r', encoding='utf-8') as f1:
    res=json.load(f1)  # {'username': 'jerry', 'age': 18}
    print(res, type(res))    

"""补充扩展"""

d = {'username':'jerry你好啊', 'age':18}
print(json.dumps(d))  # {"username": "jerry\u4f60\u597d\u554a", "age": 18}
print(json.dumps(d,ensure_ascii=False))

有时候可以查看源码来学习一些新东西,以后遇到函数不知道怎么用,就要追代码。

ctrl + 点击 追源码

pickle模块

pickle的使用方式跟json一模一样,json中有四个方法,pickle也是这四个方法

# 能够被序列化的数据类型不一样,json能够序列化的数据类型是有限的

   json有:dict list, tuple str  int, float True False  None

   pickle能够序列化的类型:所有数据类型

# 不好的地方在于,被pickle处理之后的数据只能够在自己语言中使用

pickle序列化之后的结果是二进制的

d = {"a":1, 'b':2}
import pickle
res = pickle.dumps(d)   # b'\x80\x04\x95\r\x00\x00\x00\x0...'
print(pickle.loads(res))    # 反序列
with open('a.txt', 'wb') as f:
    pickle.dump(d, f)
with open('a.txt', 'rb') as f:
    print(pickle.load(f))

hashlib模块

摘要算法又称哈希算法、散列算法。

它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常是16进制字符)

import hashlib
#  1、先指定使用的加密算法:MD5 sha系列 sha1 sha128 sha256等
m = hashlib.md5()   # 加密数据的时候,使用的是md5算法
m.update(b'123456')   # 2. 指定需要加密的数据
print(m.hexdigest())  # 取出加密之后的结果  # e10adc3949ba59abbe56e057f20f883e    
"""不管多长,加密后长度是固定的
   加密后不能反推出明文"""

# 被加密的密文越长,被破解的难度就越大,但是数据传输需要占用的资源就越大

import hashlib
m = hashlib.sha1()
m.update('hello',encode('utf-8'))
print(m.hexdigest())   # e3kcxck34453ekd....
'''sha系统一般只会用于支付宝支付'''

hashlib之注册登录

注册:

import hashlib
import random

def get_code(n):       # 设置随机数函数
    code = ''
    for i in range(n):
        random_int = str(random.randint(0, 9))
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        temp = random.choice([random_int, random_upper, random_lower])
        code += temp
    return code

username = input('username:>>>').strip()
password = input('password:>>>').strip()   # 用户输入密码

random_str = get_code(4)      
s_passowrd = password + random_str     # 注册密码加随机干扰项,调用函数
m = hashlib.md5()
m.update(s_passowrd.encode('utf-8'))
new_pwd = m.hexdigest()[0:16]     # 取加密十六位
data = '%s|%s|%s\n' % (username, new_pwd, random_str)    # 定义写入的格式

with open('userinfo.txt', 'a', encoding='utf-8') as f:    # 写入文件保存
    f.write(data)

登录:

username = input('username:>>>').strip()     
password = input('password:>>>').strip()      # 用户输入
 
with open('userinfo.txt', 'r', encoding='utf-8') as f:     # 读取文件里的内容
    real_username, real_password, random_str = f.read().split('|')   # 解压赋值

s_passowrd = password + random_str      # 将登录密码加上随机数再进行加密
m = hashlib.md5()                         
m.update(s_passowrd.encode('utf-8'))
new_pwd = m.hexdigest()[0:16]

if username == real_username and new_pwd == real_password:    
    print('密码正确')               # 将登录输入的密码与文件中的密码相比对是否相等
else:
    print('用户名和密码不正确')

今日思维导图:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值