序列化 加密 OS sys 模块

序列化模块

为什么要有序列化模块

1.文件存取时,遇到的矛盾.
	数据 读取出来时,反转不回去.
2.凡是数据通过网络传出去最终的格式必须bytes

序列化模块作用

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

序列化模块的分类

json 模块: 是所有语言公认的一种序列.最最常用的
	所以支持的python数据结构有限: int str bool dict list(tuple),None,float
	
pickle模块: 只能python语言中使用的,序列化模块:
	支持python所有的数据类型以及对象.

json模块的使用

方法

多个数据存储文件 主要用于网络传输
dumps
loads 
单个数据的存取文件
dump 
load

举例

import json
dic = {'username': '太白', 'password': 123,'status': False}
ret=json.dumps(dic)
print(ret,type(ret))
ret_dict = json.loads(ret)
print(ret,type(ret_dict))

特殊的参数

特殊的参数ensure_ascii确定是不是使用ascii码 sort_keys我可以给这个字典排序
dic = {'username': '太白', 'password': 123,'status': False}
ret = json.dumps(dic,ensure_ascii=False,sort_keys=True)
print(ret,type(ret))

json 文件的存取

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))

多json数据的存取

多个数据如何存储到一个文件中 必须换行 不然读取时不识别 会报错?
import json
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,type(ret))

pickle模块

简历

1.只能是网络传输
2.只能python语言中使用的, 支持python所有的数据类型以及对象.

方法

只能是网络传输  直接转化为字节
     dumps
     loads  
数据结构存取文件.
	dump
    load 

举例 dump load

import pickle
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,type(ret))


import pickle
#多个数据写入文件
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)
    while 1:
        try:
            ret1 = pickle.load(f1)
            print(ret1)
        except Exception:
            break

举例 dumps,loads

只能是网络传输  直接转化为字节
l1 = ['wusir', '太白', '小黑', 666]
ret = pickle.dumps(l1)
print(ret)

l2 = pickle.loads(ret)
print(l2,type(l2))

sys模块

import sys
# sys.path  ***
# print(sys.version)  # 版本

# for i in range(3):
#     print(i)
# # exit()  # 强制退出
# # quit()
# for i in range(5):
#     print(i)

# print(sys.platform)

os 模块

重点要记

print(os.getcwd())#上一级绝对路径  ***
print(__file__)  # 动态获取当前文件的绝对路径父级目录的获取:只用加上os.path.dirname(当前路径)即可
os.path.dirname(os.path.dirname(__fifl__))#爷爷级路径

print(os.chdir("dirname"))  改变当前脚本工作目录;相当于shell下cd  **
print(os.curdir)  #返回当前目录: ('.')  **
print(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下为"\t\n",Linux下为"\n" *

os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为: *

os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix' *

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(A,B)  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 拼接路径 ***
os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间  **
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间  **
# os.path.getsize(path) 返回path的文件大小 文件的字节数 ***

和执行系统命令相关

os.system("bash command")  运行shell命令,直接显示  **
os.popen("bash command).read()  运行shell命令,获取执行结果  **
os.environ  获取系统环境变量  **

hashlib模块

作用

密码加密
文件的一致性校验
加盐就是加在前面
sha系列: 安全系数高,耗时高.
分步update 与一次性updete效果一样 所以文件效验可以for循环

用法

import hashlib
new_md5 = hashlib.md5()  #创建hashlib的md5对象
new_md5.update('字符串'.encode(‘utf-8))  #将字符串载入到md5对象中,获得md5算法加密#注意这里必须要编码,否则报错。
print(new_md5.hexdigest())  #通过hexdigest()方法,获得new_md5对象的16进制md5显示。
简单来说。就是三步:
1,建立加密对象。2,对字符串进行算法加密。3,获得16进制显示

加盐

# 加固定盐
ret = hashlib.md5('1'.encode('utf-8'))#1就是盐
# ret.update('23456'.encode('utf-8'))#动态盐就是设置变量
s = ret.hexdigest()
print(s,type(s))

文件加密效验

import hashlib
def md5_file(path):
    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()
print(md5_file(r'D:\s23\day17\python-3.7.4rc1-embed-win32.zip'))

posted @ 2020-03-01 10:28  一起奥利给  阅读(218)  评论(0编辑  收藏  举报