python之序列化、OS、SYS、hashlib模块

一、序列化模块

1.序列化模块的用途

将一种数据结构转换成特殊的序列(特殊字符串,bytes),并且还可以转换回去

凡是数据通过网络传出去最终的格式必须bytes

2.json模块

json 是一种轻量级的数据交换格式

用途: 所有编程语言公认的一种序列

缺点: 支持的python的数据结构有限,只支持: int str bool dict list tuple None 除了(set())和对象

用法一 (两对儿,四个方法)
dumps,loads # 用于网络传输 #原则一对一,一个dumps对应一个loads

# 转换传输
dic = {'username':'太白'}
ret = json.dumps(dic,ensure_ascill=False,sort_keys=True)
print(ret)

# 反转回来
ret_dict = json.loads(ret)
print(ret_dict)
将转换后的特殊字符串写入文件,再从文件中读取出来,再反转回来
import json
dic = {'username': '太白', 'password': 123,'status': False}

with open('register.json',mode='w',encoding='utf-8') as f1:
	ret = json.dumps(dic, ensure_ascii=False)
	f1.write(ret+'\n')
with open('register.json',mode='r',encoding='utf-8') as f2:
	for line in f2:
		ret_dic = json.loads(line)
		print(ret_dic)

# 该题练习主题是: 先将转换写入文件,再从文件中读取出来,反转回来
# register.json内容
{"username": "太白", "password": 123, "status": false}
# 输出结果
{'username': '太白', 'password': 123, 'status': False}
用法二
dump,load # 用于单个数据的存取文件,只能用于单个字典,用法很狭窄
import json
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,type(dic1))
将多个数据存储到一个文件中
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)

3. pickle模块

用途: 支持python的所有类型和数据对象

缺点: 只能python使用

用法一 (两对儿,四个方法)
dumps,loads # 只能是网络传输用,直接转换成bytes

# 转换传输
l1 = ['wusir', '太白', '小黑', 666]
ret = pickle.dumps(l1)
print(ret)

# 反转回来
l2 = pickle.loads(ret)
print(l2)

用法二
dump,load # 用于单个数据的存取文件,只能用于单个字典,用法很狭窄
l1 = ['wusir', '太白', '小黑', 666]
with open('a.pickle',mode='wb') as f1:
	pickle.dump(l1,f1)

shevle模块(不讲)

用途: 只能是文件存取,shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些

用法

import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
f.close()

import shelve
f1 = shelve.open('shelve_file')
existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)

二、sys模块

用法

import sys

sys.path ***

sys.version

sys.argv

for i in range(3)
	print(i)
sys.exit(n) # 强制退出

三、OS模块

用法

import os
print(os.getcwd()) # 获取当前的绝对路径
os.chdir(r'/Users/wuqiang/work/PycharmProjects/python23') # 切换目录 相对于shell下cd
print(os.curdir) # 返回当前路径

# 和文件相关
os.makedirs('目录1/目录2')
os.makedirs('dirname1/dirname2/dirname4') #创建多级目录
os.removedirs('dirname1/dirname2/dirname4') #递归删除多级目录
os.mkdir('abc') #创建单级目录
os.rmdir('abc') #删除单级目录
print(os.listdir('/Users/wuqiang/work/PycharmProjects/python23')) #查看目录下文件类似ls
print(os.stat('/Users/wuqiang/work/PycharmProjects/python23')) #获取状态,文件信息
print(os.environ) #获取环境变量

# 路径相关
print(os.path.abspath('day17.py')) # 获取绝对路径
print(os.path.split(os.path.abspath('day17.py'))) #将文件路径和文件名分割
print(os.paty.dirnaem('day17.py'))
print(__file__) #动态获取当前文件的绝对路径
print(os.path.dirname(os.path.dirname(__file__))) #获取爷爷级目录
print(os.path.basename('day17.py')) #获取文件名
print(os.path.exists('day17.py')) # 判断文件是否存在
print(os.path.isabs('/Users/wuqiang/work/PycharmProjects/python23/day17')) #判断是不是绝对路径
print(os.path.isfile('/Users/wuqiang/work/PycharmProjects/python23/day17')) #判断是不是存在的文件
print(os.path.isdir('day17.py')) #判断是否是一个目录
print(os.path.exists('day17.py')) #判断这个路径或文件是否存在
print(os.path.join('/Users/wuqiang/work/PycharmProjects/python23/day17','day17.py'))#将路径和文件拼接在一起
print(os.path.getatime('/Users/wuqiang/work/PycharmProjects/python23/day17'))#最后访问时间
print(os.path.getmtime('/Users/wuqiang/work/PycharmProjects/python23/day17'))#最后修改时间
print(os.path.getsize('/Users/wuqiang/work/PycharmProjects/python23/day17')) #文件的大小

文件的拼接

print(os.path.join('/user/local/','filename.txt'))

# 输出结果
/user/local/filename.txt

四、hashlib (加密)

用途: 加密模块,摘要算法,散列算法,它是一堆加密算法的集合

  • 密码加密
  • 文件的一致性校验

hashlib如何加密:

  • 将一个bytes类型的数据,通过hashlib进行加密返回一个等长度的16进制数字
  • 过程不可逆
  • 相同的bytes类型的数据通过相同的加密码方法得到的数字绝对相同
  • 不相同的bytes类型的数据通过相同的加密方法得到的数字绝对不相同
密码加密用法:
ret = hashlib.mkd5()
ret.update('123'.encode('utf-8'))
print(ret.hexdigest())
# 输出结果
202cb962ac59075b964b07152d234b70
文件一致性校验:
def encryption(path):
	import hashlib
	ret = hashlib.md5()
	with open(path, mode='rb') as f1:
		while 1:
			content = f1.read(1024)
			if  content:
				ret.update(content)
			else:
				return ret.hexdigest()
a = encryption('/Users/wuqiang/Downloads/python-3.7.4rc1-embed-win32.zip')
print(a)
#输出结果

加固定盐
ret = hashlib.md5('xxx教育'.encode('utf-8'))
ret.update('123'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))

#输出结果
2230499227e2134dc58609d8c8997cd9 <class 'str'>
加动态的盐
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('123456fdklsajflsdfjsdlkafjafkl'.encode('utf-8'))
s = ret.hexdigest()
print(s,type(s))
posted @ 2019-06-29 17:15  爱咋闹  阅读(277)  评论(0编辑  收藏  举报