Python知识——序列化、JSON函数、pickle、configparser、hashlib模块

序列化 & 反序列化

把内存的数据类型转换成一种特定的格式,该格式的内容可用于存储或者传输给其他平台使用

内存中的数据类型——>序列化——>特定的格式(json格式或者pickle格式)
内存中的数据类型<——反序列化<——特定的格式(json格式或者pickle格式)

用途:

  1. 可用于存储——>用于存档
  2. 传输给其他平台使用——>跨平台数据交互

针对用途1的特定格式:可以用一种专用的格式——>pickle 只有python可以识别
针对用途2的特定格式:应该是一种通用,能够被所有语言识别的格式=》json

如何序列化与反序列化

JSON函数:

json.dumps 将 Python 对象编码成 JSON 字符串

import json

#序列化
dumps_res=json.dumps([1,'aaa',True,False])
print(dumps_res,type(dumps_res))

'''
[1, "aaa", true, false] <class 'str'>
'''

json.loads 将已编码的 JSON 字符串解码为 Python 对象

#反序列化
loads_res=json.loads(dumps_res)
print(loads_res,type(loads_res))

'''
[1, 'aaa', True, False] <class 'list'>
'''

将一个数据序列化后的内容存储在文件当中,再反序列

dumps_res=json.dumps([1,'aaa',True,False])
 with open(r'D:\python\text.txt',mode='wt',encoding='UTF-8') as f:
    f.write(dumps_res)

with open(r'D:\python\text.txt',mode='rt',encoding='UTF-8') as f:
    loads_res=f.read()
    l=json.loads(loads_res)
    print(l)

'''
[1, 'aaa', True, False]
'''

在这里插入图片描述
上述的简单方法:
json.dump

with open(r'D:\python\text.txt',mode='wt',encoding='UTF-8') as f:
	json.dump([1,'aaa',True,False],f)

在这里插入图片描述

json.load

with open(r'D:\python\text.txt',mode='rt',encoding='UTF-8') as f:
	l=json.load(f)
	print(l)

'''
[1, 'aaa', True, False]
'''

python 原始类型向 json 类型的转化对照表:

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

Python中集合类型无法转化为JSON类型

猴子补丁


import json
import ujson


def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads


monkey_patch_json()  # 在入口文件处运行

pickle模块

import pickle
res=pickle.dumps({1,2,3,5,6})
print(res,type(res))

'''
b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K\x05K\x06\x90.' 
<class 'bytes'>
'''

注意
在python3中执行的序列化操作如何兼容python2?

python2不支持protocol>2,默认python3中protocol=4,所以在python3中dump操作应该指定protocol=2
pickle.dump('你好啊',protocol=2)

configparser模块

ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值)。使用的配置文件的好处就是不用在程序员写死,可以使程序更灵活。

注意:在python 3 中ConfigParser模块名已更名为configparser

#text.ini文件下:

[section1]
k1=v1
k2:v2
user=egon
age=18
is_admin=true
salary=31


[section2]
k3=3
import configparser

confi=configparser.ConfigParser()
confi.read(r'D:\python\text.ini')

#获取sections 
print(confi.sections())

#获取某个section下的所有options
print(confi.options('section1'))

#获取items
print(confi.items('section1'))

#获取某个特定的值
print(confi.get('section1','user'))


'''
['section1', 'section2']
['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'),
 ('salary', '31')]
egon
'''

hashlib模块

hash一类算法,该算法接受传入的内容,经过计算得到一串hash值

hash值的特点:

  1. 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验

  2. 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码

  3. 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

用途1:特点2用于密码密文传输与验证
用途2:特点1、3用于文件完整性校验

特点1、3的验证:

import hashlib

m = hashlib.md5()
m.update('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
res = m.hexdigest()
print(res)


m1 = hashlib.md5()
m1.update('he'.encode('utf-8'))
m1.update('llo'.encode('utf-8'))
m1.update('world'.encode('utf-8'))
ret = m1.hexdigest()
print(ret)

'''
fc5e038d38a57032085441e7fe7010b0
fc5e038d38a57032085441e7fe7010b0
'''

如何使用hashlib

撞库:

m='A20080306qwer'   #明文密码
m_md5=hashlib.md5(m.encode('utf-8'))
m_m=m_md5.hexdigest()
m_m='f4921bfc59d1c4b1ba09b38a2e122716'   #以md5转化了密文

passwds=[
    'E1996325FGHY',
    'A20080306qwer',
    '2000306asdf',
    'qwer20080306A',
    'A16669852cyem'
]
#密码库,通过事先猜测密码,形成明文密码库

dir={}
for p in passwds:
    res=hashlib.md5(p.encode('utf-8'))   #将密码库的密码用md5方式转化
    dir[p]=res.hexdigest()             #并形成字典,明文密码:密文密码

# print(dir)
for k,v in dir.items():
    if v == m_m:     #对比密码库中的密文密码与截获到的密文密码进行对比
        print('撞库成功,密码是%s'%k)   #打印出明文密码
        break
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值