序列化:将一个数据结构(list,dict...)转化成一个特殊的序列(特殊的字符串)的过程
序列化模块: 将一种数据结构转化成特殊的序列(特殊的字符串,bytes)并且还可以反转回去.
1.json模块: 是所有语言公认的一种序列.最常用的,但支持的python数据结构有限=>int,str,bool,dict,list,tuple,None,float
2.pickle模块: 只能python语言中使用的,支持python所有的数据类型以及对象.
3.shevle模块(了解): 只能是文件存取.
import json
# dumps,loads 主要用于网络传输,可以用于文件的存取.
dic = {'username': '太白', 'password': 123,'status': False}
ret = json.dumps(dic)
print(ret)
ret_dict = json.loads(ret)
print(ret_dict)
# 特殊的参数
dic = {'username': '太白', 'password': 123,'status': False}
ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
print(ret)
# 写入文件
dic = {'username': '太白', 'password': 123,'status': False}
s_dict = json.dumps(dic)
with open('jsonlx.json',encoding='utf-8',mode='w') as f1:
f1.write(s_dict)
with open('jsonlx.json',encoding='utf-8') as f2:
content = f2.read()
print(json.loads(content))
# 多个数据存储到一个文件中
dic1 = {'username': '太白', 'password': 123,'status': False}
dic2 = {'username': 'alex', 'password': 123,'status': False}
dic3 = {'username': 'ly', 'password': 123,'status': False}
with open('jsonmore.json',encoding='utf-8',mode='a') as f1:
f1.write(f'{json.dumps(dic1)}\n{json.dumps(dic2)}\n{json.dumps(dic3)}')
with open('jsonmore.json',encoding='utf-8') as f1:
for line in f1:
ret = json.loads(line)
print(ret)
# dump load 单个数据的存取文件.
dic = {'username': '太白', 'password': 123,'status': False}
with open('jsonlx1.json',encoding='utf-8',mode='w') as f1:
json.dump(dic,f1)
with open('jsonlx1.json',encoding='utf-8') as f1:
dic1 = json.load(f1)
print(dic1)
import pickle
# dumps,loads 只能是网络传输
l1 = ['wusir', '太白', '小黑', 666]
ret = pickle.dumps(l1) => 直接转换成bytes
print(ret)
l2 = pickle.loads(ret)
print(l2)
# dump load 数据结构存取文件.
l1 = ['wusir', '太白', '小黑', 666]
with open('pickle练习.pickle',mode='wb') as f1:
pickle.dump(l1,f1)
with open('pickle练习.pickle', mode='rb') as f1:
ret = pickle.load(f1)
print(ret)
# 多个数据写入文件
l1 = ['wusir', '太白', '小黑1', 666]
l2 = ['wusir', '太白', '小黑2', 666]
l3 = ['wusir', '太白', '小黑3', 666]
with open('pickle练习1.pickle',mode='wb') as f1:
pickle.dump(l1,f1)
pickle.dump(l2,f1)
pickle.dump(l3,f1)
with open('pickle练习1.pickle', mode='rb') as f1:
ret1 = pickle.load(f1)
ret2 = pickle.load(f1)
ret3 = pickle.load(f1)
print(ret1,ret2,ret3)
# 目录 => 文件夹.
# 工作目录,当前目录,父级目录
import os
print(os.getcwd()) 绝对路径 ***
os.chdir(r'D:\s23\day9') 改变当前脚本工作目录
print(os.curdir) 返回当前目录的字符串名 => . **
print(os.pardir) 返回当前目录的父目录字符串名 => .. **
# 与文件夹相关
os.makedirs('dirname1/dirname2/dirname3/dirname4') 创建多级目录
os.removedirs('dirname1/dirname2/dirname3/dirname4') 截止到有文件的那层
os.mkdir(r'C:\蔡徐坤') 创建单级目录
os.rmdir('蔡徐坤') 删除单级空目录,若目录不为空则无法删除,报错
print(os.listdir(r'D:\s23\蔡徐坤')) 列出指定目录下的所有文件和子目录
# 和文件相关
os.remove() 删除一个文件 ***
os.rename("oldname","newname") 重命名文件/目录 ***
print(os.stat(r'D:\s23\day17\01 昨日内容回顾.py')) 获取文件/目录信息 **
# 与路径相关(path) ***
print(os.path.abspath(path)) 返回path的绝对路径
print(__file__) 动态获取当前文件的绝对路径
print(os.path.split(path)) 将path分割成目录和文件名以一个元组返回
print(os.path.dirname(path)) 返回path的父级目录,其实就是os.path.split(path)的第一个元素
print(os.path.basename(path)) 返回path最后的文件名,即os.path.split(path)的第二个元素
print(os.path.dirname(os.path.dirname(__file__))) 返回当前文件的爷爷级的目录
print(os.path.isabs(path)) 判断是否存在此绝对路径
print(os.path.isdir(path)) 判断是否存在此目录(文件夹)
print(os.path.isfile(path)) 判断是否存在此文件名
print(os.path.exists(path)) 判断是否存在此路径(目录,文件名)
path = os.path.join(path1,path2,path3,path4) 将多个路径组合后返回
path = os.path.join(os.path.dirname(__file__),path1,path2) 动态获取路径
print(os.path.getatime(path)) 返回path所指向的文件或者目录的最后访问时间
print(os.path.getmtime(path)) 返回path所指向的文件或者目录的最后修改时间
print(os.path.getsize(path)) 返回path的大小
import sys
sys.path 返回模块的搜索路径 ***
sys.exit(n) 退出程序
print(sys.version) python版本信息
hashlib加密
1.将一个bytes类型的数据通过hashlib进行加密返回一个等长度的16进制数字.
2.过程不可逆.
3.相同的bytes类型的数据通过相同的加密方法得到的数字绝对相同.
4.不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同.
import hashlib
# 密码加密 md5
ret = hashlib.md5()
ret.update('123'.encode('utf-8'))
s = ret.hexdigest()
print(s)
# 撞库 => 加固定盐
ret = hashlib.md5('蔡徐坤'.encode('utf-8'))
ret.update('123456'.encode('utf-8'))
s = ret.hexdigest()
print(s)
# 加动态的盐
username = input('输入用户名:').strip()
password = input('输入密码').strip()
ret = hashlib.md5(username[::2].encode('utf-8'))
ret.update(password.encode('utf-8'))
s = ret.hexdigest()
print(s)
# sha系列(安全系数高,耗时高) => 加盐,加动态盐
ret = hashlib.sha512()
ret.update('123'.encode('utf-8'))
s = ret.hexdigest()
print(s)
# 文件的一致性校验
low版
ret = hashlib.md5()
with open('文件校验',mode='rb') as f1:
content = f1.read()
ret.update(content)
print(ret.hexdigest())
ret = hashlib.md5()
with open('文件校验1',mode='rb') as f1:
content = f1.read()
ret.update(content)
print(ret.hexdigest())
分步update
s1 = '老男孩教育 最好的python 讲师 是 太白'
ret = hashlib.md5()
ret.update('老男孩教育'.encode('utf-8'))
ret.update(' 最好的python'.encode('utf-8'))
ret.update(' 讲师 是'.encode('utf-8'))
ret.update(' 太白'.encode('utf-8'))
print(ret.hexdigest())
=> 高大上版(可拓展)
def md5_file(path):
ret = hashlib.md5()
with open(path,mode='rb') as f1:
while True:
content = f1.read(1024)
if content:
ret.update(content)
else:
return ret.hexdigest()
原文:https://www.cnblogs.com/wxl1025/p/11099944.html