序列化,os,sys,hashlib,collections
1.序列化
什么是序列化?序列化的本质就是将一种数据结构(如字典,列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化.
json
1.不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
2.json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None
import json
两组四个方法:
1.dumps loads
dumps:将对象转换(序列化)成字符串
loads:将字符串转换(反序列化)成对象
lst = [1,2,3,4,5]
str_lst = json.dumps(lst) #序列化
print(str_lst)
l_lst = json.loads(str_lst) #反序列化
print(l_lst)
dic = {'k1':1,'k2':2}
str_dic = json.dumps(dic) #序列化
print(str_dic)
d_dic = json.loads(str_dic) #反序列化
print(d_dic)
2.dump load
dump:将对象转换(序列化)成字符串,写入文件
load:将文件中字符串转换(反序列化)成对象
lst = [1,2,3,4,5]
f = open("test","a",encoding = "utf-8")
json.dump(lst,f)
f.close()
f1 = open("test","r",encoding = "utf-8")
s = json.load(f1)
print(s,s[-1])
f1.close()
#同时写多个内容,进行序列化
lst = [1,2,3,4,5]
f = open("test","w",encoding = "utf-8")
f.write(json.dumps(lst) + "\n")
f.write(json.dumps(lst) + "\n")
f.write(json.dumps(lst) + "\n")
f.close()
#同时读多个内容进行反序列化
f1 = open("test","r",encoding = "utf-8")
for i in f1:
s = json.loads(i)
print(s)
f1.close()
pickle
1.只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
2.支持Python所有的数据类型包括实例化对象。
import pickle
两组4个方法:
1.dumps loads
lst = [1,2,3,4,5]
t_lst = pickle.dumps(lst) #转换成类似字节
print(t_lst)
print(pickle.loads(t_lst)[-1]) # 5
dic = {"k1":1,"k2":2}
t_dic = pickle.dumps(dic) #转换成类似字节
print(t_dic)
print(pickle.loads(t_dic)) #dic = {"k1":1,"k2":2}
def func():
print(111)
fun = pickle.dumps(func)
pickle.loads(fun)() # 111
2.dump load
dic = {"k1":1,"k2":2}
pickle.dump(dic,open("test","wb")) #在文件中写成类似字节
print(pickle,load(open("test","rb"))) #打印原内容
#同时写多个内容
dic = {"k1":1,"k2":2}
f = open("test","wb")
s = "\n".encode("utf-8")
f.write(pickle.dumps(dic) + s)
f.write(pickle.dumps(dic) + s)
f.write(pickle.dumps(dic) + s)
f.close()
#同时读多个内容
f1 = open("test","rb")
for i in f1:
print(pickle.loads(i))
2.os
os模块:程序员通过python向操作系统发送指令(与操作系统交互的接口)
os模块四组:
import os
1.工作目录
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir('F:\s24') 改变当前脚本工作目录,切换路径
os.curdir 返回当前目录
os.pardir 获取当前目录的父目录字符串名
2.文件夹
os.mkdir('test') 生成单级目录,即创建一个名为'test'的文件夹
os.rmdir('test') 删除单级空目录,即删除'test'文件夹,目录不为空则无法删除,报错
os.makedirs('test/ttt/sss') 递归创建文件夹
os.removedirs('test/ttt/sss') 递归删除文件夹
os.listdir(r'D:\S24') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
3.文件
os.remove() 删除一个文件,无法找回
os.rename("oldname","newname") 重命名文件/目录
os.stat("C:\学习\代码练习") 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
4.路径
os.path.abspath(r"test.py") 通过相对路径获取绝对路径
os.path.split(os.path.abspath(r"test.py")) 将文件路径以最后一个\切割,分割成目录和文件名二元组返回
os.path.dirname(r"C:\学习\代码练习\test.py") 获取目录(路径)
os.path.basename(r"C:\学习\代码练习\test.py") 获取文件名
os.path.exists(r"C:\学习\代码练习\test.py") 判断这个文件路径是否存在
os.path.iddir(r"C:\学习\代码练习") 判断是不是路径
os.path.isfile(r"test.py") 判断是不是文件
os.path.isabs(r"C:\学习\代码练习\test.py") 判断是不是绝对路径
os.path.join("D:\","学习","代码练习") 路径拼接
os.path.getatime(r"C:\学习\代码练习\test.py") 返回所指向的文件或者目录的最后修改时间
os.path.getmtime(r"C:\学习\代码练习\test.py") 返回所指向的文件或者目录的最后访问时间
os.path.getctime(r"C:\学习\代码练习\test.py") 返回所指向的文件或者目录的最后访问时间
os.path.getsize(r"C:\学习\代码练习\test.py") 获取当前文件的大小
3.sys
sys模块是与python解释器交互的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路 径当作脚本执行,能够携带参数
sys.exit(n) 退出程序,正常退出时exit(0),错误退出 sys.exit(1)
sys.version 获取Python解释器的版本信息
sys.path 添加自定义模块查找路径
sys.platform 区分操作系统然后进行相关逻辑操作
4.hashlib
hashlib模块也叫摘要算法或者加密算法,哈希算法,散列算法等等,一般的加密方法有MD5,sha1,sha256,sha512...
作用:加密和校验使用
工作原理:通过一个函数,把任意长度的数据按照一定规则转换为一个固定长度的数据串(通常用16进制的字符串表示)
hashlib的使用:
bytes类型数据 ---> 通过hashlib算法 ---> 固定长度的字符串
特征:
1..只要明文相同密文就是相同的.
2.只要明文不相同密文就是不相同的.
3.此转化过程不可逆(不能解密).
例:
alex:alex123
import hashlib
s = hashlib.md5()
s.update("alex123".encode("utf-8"))
print(s.hexdigest())
alex:b75bd008d5fecb1f50cf026532e8ae67(#加密后)
加密:
1.加密的内容
2.将要加密的内容转成字节
最常用的就是MD5,平时加密的时候使用sha1
加盐
加固定盐:
import hashlib
md5 = hashlib.md5("hello".encode("utf-8"))
md5.update("alex123".encode("utf-8"))
print(md5.hexdigest())
动态加盐:
user = input("username:")
pwd = input("password:")
import hashlib
md5 = hashlib.md5(user.encode("utf-8"))
md5.update(pwd.encode("utf-8"))
print(md5.hexdigest())
文件校验:
我们自己如何验证我们下载的资源是否有病毒呢?这就需要文件的一致性校验了。在我们下载一个软件时,往往都带有一个MD5或者shax值,当我们下载完成这个应用程序时你要是对比大小根本看不出什么问题,你应该对比他们的md5值,如果两个md5值相同,就证明这个应用程序是安全的,如果你下载的这个文件的MD5值与服务端给你提供的不同,那么就证明你这个应用程序肯定是植入病毒了(文件损坏的几率很低),那么你就应该赶紧删除,不应该安装此应用程序。
例:
我们在安装python解释器的时候,在安装python解释器的时候计算本地的md5值是否一致,一致安装,不一致的删除.获取到python3.6.6的MD5值为:767db14ed07b245e24e10785f9d28e29
f = open(r"F:\s24\day17\python-3.6.6-amd64.exe","rb")
import hashlib
md5 = hashlib.md5()
md5.update(f.read())
print(md5.hexdigest())
#校验输出的MD5值是否与官方给到的MD5值相同
节省(相对)内存的校验方法:
f = open(r"F:\s24\day17\python-3.6.6-amd64.exe","rb")
import hashlib
md5 = hashlib.md5()
while True:
msg = f.read(1024)
if msg:
md5.update(msg)
else:
print(md5.hexdigest())
break
#二者结果相同
ss = "baoyuanalextaibai"
import hashlib
md5 = hashlib.md5()
md5.update(ss.encode("utf-8"))
print(md5.hexdigest())
s = "baoyuan"
s1 = "alex"
s2 = "taibai"
import hashlib
md5 = hashlib.md5()
md5.update(s.encode("utf-8"))
md5.update(s1.encode("utf-8"))
md5.update(s2.encode("utf-8"))
print(md5.hexdigest())
5.collections
1.namedtuple:命名元组,生成可以使用名字来访问元素内容的tuple
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p) #Point(x=1, y=2)
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
是为了高效实现插入和删除操作的双向列表,适用于队列和栈
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)
# deque(['y', 'a', 'b', 'c', 'x'])
#支持pop(),popleft(),append(),appendleft()和索引
3.Counter: 计数器,主要用来计数
from collections import Counter
c = Counter('abcdeabcdabcaba')
print(c)
#Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
4.OrderedDict: 有序字典
#python3.6以上版本字典是有序的
5.defaultdict: 带有默认值的字典
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:
if row > 66:
if 'key1' not in result:
result['key1'] = []
result['key1'].append(row)
else:
if 'key2' not in result:
result['key2'] = []
result['key2'].append(row)
print(result)
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)