序列化模块 os ` sys `hashilb` conllections

day17

一丶序列化模块

什么是序列化:

将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输,或文件保存)

真正的意义:变量从内存中变成可存储或传输的过程称之为序列化

json模块:

是所有语言公认的一种序列,最常用,支持的数据结构有限:list(tuple), int .str ,bool,None,float.

### dumps ,loads  :  主要网络传输 , 用于文件的读取.  
   import json
   # 写入 json文件     dumps() 将内容序列化
   dic = {'username': '坚决不打广告', 'password': 123,'status': False}

   with open('1.json','w',encoding='utf-8') as f:
        # ensure_ascii是否使用二进制, sort_keys排序,按照键排序
       f.write(json.dumps(dic,ensure_ascii=False,sort_keys=True))

   # 读出json文件     loads() 将内容反序列化
   with open('1.json','r',encoding='utf-8') as f2:
       ret=json.loads(f2.read())
       print(ret)

   


   
   
### dump load : 单个数据的存取文件
   import json
   #写   dump()   把数据(保存的内容)和文件句柄(f)传给此函数,默认会把要保存的内容转换成字符串格式
   dic = {'username': '坚决不打广告', 'password': 123,'status': False}
   with open('2.json','w',encoding='utf-8') as f:
       json.dump(dic,f)
       
   #读
  with open('2.json', 'r', encoding='utf-8') as f2:
       content_dic = json.load(f2)
       print(content_dic)
   


   
   
#### 序列化多个字典   ,     (一个dump 对应一个load)  
   # 写入2.json文件
   dic1 = {'username': '坚决不打广告1', 'password': 123,'status': False}
   dic2 = {'username': '坚决不打广告2', 'password': 123,'status': False}
   dic3 = {'username': '坚决不打广告3', 'password': 123,'status': False}
   with open('2.json','w',encoding='utf-8') as f:
        # ensure_ascii是否使用二进制, sort_keys排序,按照键排序
       f.write(json.dumps(f'{dic1}\n{dic2}\n{dic3}',ensure_ascii=False,sort_keys=True))


   # 读出2.json文件    
   with open('1.json','r',encoding='utf-8') as f2:
       ret1=json.loads(f2.read())
       print(ret1,ret2,ret3)
       

 

pickle模块:

只能python语言中使用,序列化模块

### dumps() , loads() : 只能是网络传输 ,直接转换成bytes
   li=['wusir','tb']
   ret=pickle.dumps(li) # 将数据转换成bytes类数据 ,进行序列化
   print(ret)

   res=pickle.loads(ret) # 将bytes数据转反序列化
   print(res)





#### dump(), load() : 数据结构存取文件
   li=['wusir','tb']
   # 写入文件
   with open('pickle.pick','wb') as f : # 写入的是字节类型的数据
       pickle.dump(li,f)

   # 读取文件
   with open('pickle.pick','rb') as f :
       ret=pickle.load(f)
       print(ret)
   

   
   
#### 写入多个文件,读取多个文件,   (一个dump 对应一个load)    
   li1=['wusir1','tb']
   li2=['wusir2','tb']
   li3=['wusir3','tb']
   
   # 写入文件   写入的是字节类型数据
   with open('pickle1.pick','wb') as f1:
       pickle.dump(li1,f1)
       pickle.dump(li2,f1)
       pickle.dump(li3,f1)
       
# 读文件 读取的字节类型数据
   with open('pickle1.pick','rb') as f2:
       re1=pickle.load(f2)
       re2=pickle.load(f2)
       re3=pickle.load(f2)
       print(re1,re2,re3)

 

shevle模块:

shelve是一额简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的。然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭 ---so 不会用. 用时去百度

二丶os模块

##### 最重要, 开发必备 👇 
##### 多数操作系统的功能接口函数
import os

print(os.getcwd())   ## 获取当前的工作目录 绝对路径

print(os.chdir(r'E:\File\oldboy学习笔记\Python之路\day16'
              ))  #切换路径

print(os.curdir) # 当前路径

print(os.pardir) # 父级路径路径

### 和文件夹相关的
   os.makedirs('d111/d222/d333') # 递归创建多级目录
   
   os.removedirs('d111/d222/d333') # 递归删除目录,如果当前目录下还有文件,就删除不了
   
   os.mkdir('d1')# 创建单级目录
   
   os.rmdir('d1') # 删除单级目录
   
   print(os.listdir('E:\File\oldboy学习笔记\Python之路\day17')) # 列举绝对路径下的所有文件


### 和文件相关
   os.remove('路径') # 删除目录
   
   os.rename('路径') # 重命名
   
   print(os.stat(r'E:\File\oldboy学习笔记\Python之路\day17\01 序列化模块.py')) # 获取文件的具体信息
   
   print(os.environ)  #获取环境变量


### path 和路径相关
   print(os.path.abspath('1.json'))    # 获取某文件的绝对路径
   
   print(os.path.split(os.path.abspath('1.json')))  # 将文件名和扩展名分开 ,以路径文件名前的符号作为分隔符, 将工作路径(父级目录)和文件名切割成两个元素

   print(os.path.dirname('1.json')) # 获取当前文件的父级目录
   
   print(__file__)   # 动态获取当前文件的绝对路径
   
   print(os.path.basename('1.json')) # 获取文件的文件名
   
   print(os.path.exists('1.json')) # 判断文件或者目录是否存在
   
   print(os.path.isabs(r'02 JSON序列化.py'))     # 判断是不是一个绝对路径
   
   print(os.path.isabs(r'E:\File\oldboy学习笔记\Python之路\day17\01 序列化模块.py'))
   print(os.path.isfile('1.json')) # 判断该路径是不是一个文件路径
   
   print(os.path.isdir())  # 判断是不是一个目录

### 拼接路径( 重重之重 )
   rabs_path=os.path.dirname(__file__)  #__file__是获得当前文件的绝对路径,dirname是获取父目录
   print(os.path.join(rabs_path,'aaa','bbb')) # 拼接一个路径, 放置字符串就ok 不用写正反斜杠
   #结果: D:/XXX/XXX\aaa\bbb

   
     
# 获取文件最后访问的时间
print(os.path.getatime('1.json'))

# 获得文件最后修改的时间
print(os.path.getmtime('1.json'))

# 获得文件的大小
print(os.path.getsize('1.json'))

 

三丶sys模块

###  系统模块
import  sys
print(sys.path)  # 获取当前工作路径 ,会得到一个列表. sys.path比较常用
print(sys.version)  # 获取python解释器版本
print(sys.exit())   # 主动退出程序
print(sys.platform)  # 查看系统

 

四丶hashlib模块

#### 加密 模块 ,  摘要算法, 散列算法 , 它是一堆加密算法的集合
#### 明文形式的存储,带来安全隐患

import hashlib
   # 1. 将一个bytes类型的数据 ,通过hashlib进行加密.返回等长的16进制的数字
   # 2. 过程不可逆
   # 3. 相同的bytes类型的数据通过相同的加密方法,得到的数字绝对相同
   # 4. 不相同的bytes类的数据通过相同的加密算法,得到数字绝对不同

### 使用步骤:
# 1.声明hashlib模块
   # 2. 创建 hashlib.md5 对象(容器)
   # 3. update() 对字节文件进行md5加密
  # 4. hexdigest() 返回32位16进制的数字

## 加密 一 md5
   ret=hashlib.md5()
   ret.update('abcd多撒多撒efg'.encode('utf-8'))
   s=ret.hexdigest()
   print(s)
   print(len('df938391a6b68aaa624876a259064135')) # 32


   
## 校验文件或文件内容的一致性
   ret1=hashlib.md5()
   ret1.update('alex'.encode('utf-8'))
   s2=ret1.hexdigest()
   print(s2)

   ret2=hashlib.md5()
   ret2.update('alex'.encode('utf-8'))
   s1=ret2.hexdigest()
   print(s1)

   
   
## 撞库
  # 没日没夜的保存 随机md5的生成的值

   
   

## 加盐 在创建md5对象ret生成的时候 ,加盐,提高安全性
   ret=hashlib.md5('txdy001'.encode('utf-8'))
   ret.update('123*456'.encode('utf-8'))
   s=ret.hexdigest()
   print(s)

   
   
   
## 动态的加盐 顾名思义
   username=input('请输入用户名').strip()
   pwd=input('q请输入密码').strip()
   ret=hashlib.md5(username[::2].encode('utf-8'))
   ret.update(pwd.encode('utf-8'))
   s=ret.hexdigest()
   print(s)




##### sha 系列 : 安全系数最高,耗时高
   shaRet=hashlib.sha512()
   shaRet.update('123'.encode('utf-8'))
   s=shaRet.hexdigest()
   print(s)
   print(len('3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7das13b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2')) # 128
   
   

番外篇:md5的常规操作

#### 分步计算md5值,最后组合
import hashlib


### low版验证一个文件的的md5值
ret =hashlib.md5()
with open('md5校验','rb') as f1:
   content=f1.read()
   ret.update(content)
   s1=ret.hexdigest()
   print(s1)
# 68172d54bcd00a912c43961825c18062
ret1 =hashlib.md5()
with open('md5校验1','rb') as f2:
   content=f2.read()
   ret1.update(content)
   s2=ret1.hexdigest()
   print(s2)
# 68172d54bcd00a912c43961825c18062




#### 校验官方文档的 md5

with open('python-3.7.4rc1-embed-win32.zip','rb') as f:
   content=f.read()
   ret=hashlib.md5()
   ret.update(content)
   print(ret.hexdigest())
# d9c18c989c474c7629121c9d59cc429e
# d9c18c989c474c7629121c9d59cc429e  



#### 分步骤计算 update
def md5_file(path):
   ret = hashlib.md5()
   with open(path, 'rb') as f:
      while 1:
          content=f.read(1024) # 每次只读 1024字节, 节省内存
          if content:
              ret.update(content)    # update的功能:会把每次生成的md5值拼在一起.
          else:
              return ret.hexdigest()
           
      #-------------------------
      # for line in f:
      #     ret.update(line)
      # print(ret.hexdigest())
       
print(md5_file('python-3.7.4rc1-embed-win32.zip'))

 

五丶conllections模块

   `

posted on 2020-01-11 15:27  向往1  阅读(198)  评论(0编辑  收藏  举报

导航

……