Python进阶----os,sys,hashlib模块

Posted dengl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python进阶----os,sys,hashlib模块相关的知识,希望对你有一定的参考价值。

Python进阶(九)----os,sys,hashlib模块

一丶序列化模块

什么是序列化:

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

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

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\ndic2\ndic3',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模块

以上是关于Python进阶----os,sys,hashlib模块的主要内容,如果未能解决你的问题,请参考以下文章

Python(os和sys)理解

python常用模块1

python中sys和os的区别

python每日一类:os和sys

python 内置模块os 和 sys

Python模块——sys和os