序列化模块
import json
# json 序列化模块 是所有语言通用的一种标准(数据转化格式)。
# str int bool dict list(tuple) None
import pickle
# pickle 序列化模块 只是支持python语言之间的互相传输。
# python语言的所有数据类型 对象 都可以进行网络传递
# 写入文件时 可以写入多个。
import shelve # 了解
# shelve 序列化模块 只是支持python语言,与文件相关。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 第一对方法:dumps loads 与网络传输相关 dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']} print(dic) s = json.dumps(dic,ensure_ascii=False) # 序列化过程 print(s,type(s)) dic1 = json.loads(s) # 反序列化过程 print(dic1, type(dic1))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 第二对 dump load 与文件相关 dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']} with open('序列化.json', encoding='utf-8', mode='w') as f1: json.dump(dic, f1, ensure_ascii=False) with open('序列化.json', encoding='utf-8',) as f2: ret = json.load(f2) print(ret, type(ret))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 参数讲解: dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'} print(dic) s = json.dumps(dic,ensure_ascii=False,sort_keys=True,separators=('|',',')) # 序列化过程 # sort_keys 按键排序 # ensure_ascii=False 显示中文 # separators=('|',',') 设置分隔符 没有意义
json 和 bytes的区别
bytes 只能操作str,用于网路传输
json 可操作 str , int,bool,dict,list,(tuple),None用于网路传输,文件存储
用json将多个字典写入一个文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 如果用dump load 一个文件只能写入一个数据结构 dic1 = {'name': '春哥'} dic2 = {'name': '子伍'} dic3 = {'name': '王子'} with open('多个字典.json',encoding='utf-8',mode='w') as f1: f1.write(json.dumps(dic1, ensure_ascii=False) + ' ') f1.write(json.dumps(dic2, ensure_ascii=False) + ' ') f1.write(json.dumps(dic3, ensure_ascii=False)) with open('多个字典.json',encoding='utf-8',mode='r') as f1: for line in f1: print(json.loads(line)) ret1 = json.loads(f1.read()) ret2 = json.loads(f1.read()) ret3 = json.loads(f1.read()) print(ret1, ret2, ret3)
总结:
dumps loads用于网络传输和多个数据写入文件
dump load 只能用于一个数据结构写入文件
注意:
# 坑: dic = {1: 'alex'} # 如果键是数字,自动转字符串 ret = json.dumps(dic) print(ret) print(json.loads(ret))
import pickle
dumps loads 用于网络传输 :将数据结构 ----> 转化成bytes
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'} s1 = pickle.dumps(dic) print(s1) # 是bytes字符显示,不能显示任何其他类型 dic2 = pickle.loads(s1) print(dic2)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒'], 'age': 18, 'money': '1个亿'} with open('p1.pickle',mode='wb') as f1: # wb: bytes形式 pickle.dump(dic, f1) # 操作文件用dump with open('p1.pickle',mode='rb') as f1: dic1 = pickle.load(f1) # 注意要用load print(dic1)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 利用dump load 将多个数据写入文件 dic1 = {'name': '春哥'} dic2 = {'name': '子伍'} dic3 = {'name': '王子'} with open('p2.pickle',mode='wb') as f1: pickle.dump(dic1, f1) pickle.dump(dic2, f1) pickle.dump(dic3, f1) with open('p2.pickle', mode='rb') as f2: print(pickle.load(f2)) print(pickle.load(f2)) print(pickle.load(f2))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): print(666) with open('p3.pickle',mode='wb') as f1: pickle.dump(func,f1) #函数名写入文件 with open('p3.pickle',mode='rb') as f1: ret = pickle.load(f1) ret() # ret() == func()
json 和 pickle
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle
import shelve # 了解
# shelve序列化模块,只是支持python语言,与文件相关
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import shelve f = shelve.open('shelve_file') f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据 f.close() # 给文件写入一个字典:{'key':{'int':10, 'float':9.5, 'string':'Sample data'}} f = shelve.open('shelve_file') print(f['key']) f.close() import shelve f1 = shelve.open('shelve_file',writeback=True) print(f1['key']) f1['key']['new_value'] = 'this was not here before' f1.close() f1 = shelve.open('shelve_file') print(f1['key']) f1.close() # writeback=True 如果相对shelve文件进行修改,必须要添加这个参数
import hashlib
给密码加密
文件的校验
hashlib:将str类型,通过算法 -----> 一串等长度的数字
1、不同的字符串,转化成数字肯定不同
2、相同的字符串即使在不同的计算机上只要使用相同的加密方式,转化的数字一定相同
3、hashlib加密不可逆,不能破解
MD5
普通版,容易破解
import hashlib ret = hashlib.md5() ret.update('123'.encode('utf-8')) print(ret.hexdigest()) # 202cb962ac59075b964b07152d234b70
静态加盐版:
import hashlib ret = hashlib.md5('verygood'.encode('utf-8')) # # 加盐,给每一个密码添加verygood后,在计算md5码 ret.update('123456'.encode('utf-8')) print(ret.hexdigest())
动态加盐:
import hashlib username = input('用户名: ') ret = hashlib.md5(username[::2].encode('utf-8')) # # 动态加盐,给每一个密码添加切片后的用户名,在计算md5码 ret.update('123456'.encode('utf-8')) print(ret.hexdigest())
md5 加密效率快,通用,安全性相对差
sha系列,算法更好 安全性高,效率低,耗时长
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib # ret = hashlib.sha1() # ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8')) # print(ret.hexdigest()) # # # ret = hashlib.sha512() # ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8')) # print(ret.hexdigest())
文件的校验
小文件校验
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib def check_md5(file): ret = hashlib.md5() with open(file, mode='rb') as f1: ret.update(f1.read()) # 读全文 return ret.hexdigest() print(check_md5('文件校验1')) print(check_md5('文件校验2'))
大文件校验
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import hashlib def check_md5(file): ret = hashlib.md5() with open(file, mode='rb') as f1: while 1: count = f1.read(1024) # 每次读1204个字节 if count: # 文件最后一次读为空,count为False 走else ret.update(count) else: break return ret.hexdigest() print(check_md5('文件校验1')) print(check_md5('文件校验2'))
os模块:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 *** os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') #和文件夹相关 os.makedirs('dirname1/dirname2') 可生成多层递归目录 *** os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname ** os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ** # 和文件相关 os.remove() 删除一个文件 *** os.rename("oldname","newname") 重命名文件/目录 *** os.stat('path/filename') 获取文件/目录信息 # 和操作系统差异相关 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' # 和执行系统命令相关 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 #path系列,和路径相关 *** os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小
SYS模块
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys try: sys.exit('意外中断....') except SystemExit as e: print(e)
collections模块
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import deque q = deque(['a','b','c']) print(q) # 从右边增加值 q.append('x') q.append('y') # 从右边删除值 q.pop() q.pop() # 从左边增值 q.appendleft('x') q.appendleft('y') # 从左边删除 q.popleft() q.popleft() print(q)
3.Counter: 计数器,主要用来计数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from collections import Counter # s1 = '电脑电脑sldfjslffdsaf' s1 = ['电脑','电脑','电脑','电脑','书'] c = Counter(s1) print(c) print(dict(c)) # {'电脑': 4, '书': 1}
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典