序列化模块、os、hashlib、sys

一、序列化模块

  1. 序列化定义:序列化的本质就是将一种数据结构(如字典、列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化
  2. 为什么要有序列化模块
    dic = {'username':'太白', 'password': 123,'login_status': True}
    
    你的程序中有一些地方都需要使用这个dic数据,登录时会用到,注册时也会用到。那么我们之前就是将这个dic写在全局里,但是这样是不合理的,应该是将这数据写入一个地方存储(还没有学数据库)先存放在一个文件中,那么程序中哪里需要这个数据了,你就读取文件取出你需要的信息即可。那么有没有什么问题? 你将这个字典直接写入文件是不可以的,必须转化成字符串的形式,而且你读取出来也是字符串形式的字典(可以用代码展示)。
    
    那么你拿到一个str(dic)有什么用?他是根本转化不成dic的(不能用eval很危险),所以很不方便。那么这时候序列化模块就起到作用了,如果你写入文件中的字符串是一个序列化后的特殊的字符串,那么当你从文件中读取出来,是可以转化回原数据结构的。
  3. 序列化模块的两种用法:
    • 网络传输的中间环节
    • 文件存储的中间环节
  4. python中的三种序列模块
    1. json

      • 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串。(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3])
      • json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None
    2. pickle
      • 只能是Python语言遵循的一种数据转化格式,只能在python语言中使用。
      • 支持Python所有的数据类型包括实例化对象。
    3. shelve
      • 类似于字典的操作方式去操作特殊的字符串(了解)。
  5. json模块
    1. 用于网络传输:dumps、loads

      import json
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
      print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
      #注意,json转换完的字符串类型的字典中的字符串是由""表示的
      
      dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
      #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
      print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
      
      list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
      str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
      print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
      list_dic2 = json.loads(str_dic)
      print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
    2. 用于文件写读:dump、load
      import json
      f = open('json_file.json','w')
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
      f.close()
      # json文件也是文件,就是专门存储json字符串的文件。
      f = open('json_file.json')
      dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
      f.close()
      print(type(dic2),dic2)
    3. 其他参数说明
      • ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。
      • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 sort_keys:将数据根据keys的值进行排序。
    4. json序列化存储多个数据到同一个文件中

      对于json序列化,存储多个数据到一个文件中是有问题的,默认一个json文件只能存储一个json数据,但是也可以解决,举例说明:

      dic1 = {'name':'oldboy1'}
      dic2 = {'name':'oldboy2'}
      dic3 = {'name':'oldboy3'}
      f = open('序列化',encoding='utf-8',mode='a')
      str1 = json.dumps(dic1)
      f.write(str1+'\n')
      str2 = json.dumps(dic2)
      f.write(str2+'\n')
      str3 = json.dumps(dic3)
      f.write(str3+'\n')
      f.close()
      
      f = open('序列化',encoding='utf-8')
      for line in f:
          print(json.loads(line))
  6. pickle模块
    1. pickle模块是将Python所有的数据结构以及对象等转化成bytes类型然后还可以反序列化还原回去。
    2. 用于网络传输:dumps、loads
      import pickle
      dic = {'k1':'v1','k2':'v2','k3':'v3'}
      str_dic = pickle.dumps(dic)
      print(str_dic)  # bytes类型
      
      dic2 = pickle.loads(str_dic)
      print(dic2)    #字典
      
      #还可以序列化对象
      import pickle
      
      def func():
          print(666)
      
      ret = pickle.dumps(func)
      print(ret,type(ret))  # b'\x80\x03c__main__\nfunc\nq\x00.' <class 'bytes'>
      
      f1 = pickle.loads(ret)  # f1得到 func函数的内存地址
      f1()  # 执行func函数
    3. 用于文件写读:dump、load
      dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
      f = open('pick序列化',mode='wb')
      pickle.dump(dic,f)
      f.close()
      with open('pick序列化',mode='wb') as f1:
          pickle.dump(dic,f1)
    4. pickle序列化存储多个数据到一个文件中
      dic1 = {'name':'oldboy1'}
      dic2 = {'name':'oldboy2'}
      dic3 = {'name':'oldboy3'}
      
      f = open('pick多数据',mode='wb')
      pickle.dump(dic1,f)
      pickle.dump(dic2,f)
      pickle.dump(dic3,f)
      f.close()
      
      f = open('pick多数据',mode='rb')
      while True:
          try:
              print(pickle.load(f))
          except EOFError:
              break
      f.close()

二、OS模块

  1. os模块是与操作系统交互的一个接口,它提供的功能多与工作目录,路径,文件等相关
  2. 当前执行这个python文件的工作目录相关的工作路径
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径  **
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd  **
    os.curdir  返回当前目录: ('.')  **
    os.pardir  获取当前目录的父目录字符串名:('..') **
  3. 和文件夹相关
    os.makedirs('dirname1/dirname2')    可生成多层递归目录  ***
    os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 ***
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname ***
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname ***
    # os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 **
  4. 和文件相关
    os.remove()  删除一个文件  ***
    os.rename("oldname","newname")  重命名文件/目录  ***
    os.stat('path/filename')  获取文件/目录信息 **
  5. 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的大小 ***
  6. 获取文件/目录信息 的结构说明
    os.stat('path/filename') 

三、sys模块

  1. sys模块是与python解释器交互的一个接口
  2. sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        获取Python解释程序的版本信息
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  ***
    sys.platform       返回操作系统平台名称

四、hashlib模块

  1. hashlib的特征以及使用要点:

    1. bytes类型数据 ---> 通过hashlib算法 ---> 固定长度的字符串
    2. 不同的bytes类型数据转化成的结果一定不同。
    3. 相同的bytes类型数据转化成的结果一定相同。
    4. 此转化过程不可逆。
  2. hashlib的主要用途
    • 密码的加密
    • 文件一致性校验
  3. 密码的加密
    1. 普通加密:

      我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

      import hashlib
      md5 = hashlib.md5()
      md5.update('123456'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      'e10adc3949ba59abbe56e057f20f883e'
      
      # 验证:相同的bytes数据转化的结果一定相同
      import hashlib
      
      md5 = hashlib.md5()
      md5.update('123456'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      'e10adc3949ba59abbe56e057f20f883e'
      
      # 验证:不相同的bytes数据转化的结果一定不相同
      import hashlib
      
      md5 = hashlib.md5()
      md5.update('12345'.encode('utf-8'))
      print(md5.hexdigest())
      
      # 计算结果如下:
      '827ccb0eea8a706c4c34a16891f84e7b'
    2. 加盐加密
      • 固定的盐

        ret = hashlib.md5('xx教育'.encode('utf-8'))  # xx教育就是固定的盐
        ret.update('a'.encode('utf-8'))
        print(ret.hexdigest())
      • 动态的盐
        username = '太白金星666'
        ret = hashlib.md5(username[::2].encode('utf-8'))  # 针对于每个账户,每个账户的盐都不一样
        ret.update('a'.encode('utf-8'))
        print(ret.hexdigest())
      • sha系列: 安全系数高,耗时高.
        加盐,加动态盐
        ret = hashlib.sha512()
        ret.update('123456fdklsajflsdfjsdlkafjafkl'.encode('utf-8'))
        s = ret.hexdigest()
        print(s,type(s))
  4. 文件的一致性校验
    1. 文件校验

      def file_check(file_path):
          with open(file_path,mode='rb') as f1:
              sha256 = hashlib.sha256()
              while 1:
                  content = f1.read(1024)
                  if content:
                      sha256.update(content)
                  else:
                      return sha256.hexdigest()
      print(file_check('pycharm-professional-2019.1.1.exe'))

原文地址:https://www.cnblogs.com/cuixiaoying/p/11104804.html

时间: 2024-10-08 00:37:15

序列化模块、os、hashlib、sys的相关文章

学习17.内容# 1.序列化 # 2.os # 3.sys # # 4.摘要 # 5.collections

序列化 什么是序列化 -- json lit = [1, 2, 3, 4, 5,] _lit= str(lit) print(_lit) print(list(_lit)) print(eval(_lit)) import json 两组四个方法 1.dumps loads 2.dump load lit = [1, 2, 3, 4, 5, ] _lst = json.dumps(lit) print(_lst,type(_lst)) lis = json.loads(_lst) print(l

Day5模块-os和sys模块

os模块:操作系统调用的接口 -------------------------------------------------------------------------------------------- >>> os.listdir() #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印['.android', '.PyCharm2016.3', '.PyCharm2017.1', '.VirtualBox', '.YYBox', 'AppData', 'Ap

python之os、sys和random模块

import os # print(os.getcwd())#获取当前目录,绝对路径# print(os.chdir('../'))#更改当前目录,../的意思是退回上一级目录# print(os.getcwd())# print(os.curdir)#当前目录,相对路径# print(os.pardir)#当前目录,相对路径# print(os.mkdir('test0117'))#创建文件夹# print(os.rmdir('test0117'))#删除文件夹,只能删除空文件夹# print

6 - 常用模块(os,sys,time&amp;datetime,random,json&amp;picle,shelve,hashlib)

导入模块 想使用 Python 源文件,只需在另一个源文件里执行 import 语句 import module1[, module2[,... moduleN] from语句让你从模块中导入一个指定的部分到当前命名空间中 from modname import name1[, name2[, ... nameN]] 内置的函数 dir() 可以找到模块内定义的所有名称.以一个字符串列表的形式返回 >>> import sys >>> dir(sys) ['__disp

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

python 正则,os,sys,hashlib模块

简单的小算法 random随机获取数据 import random def getrandata(num): a=[] i=0 while i<num: a.append(random.randint(0,100)) i+=1 return a print(getrandata(10)) 例: [5, 3, 38, 4, 69, 40, 94, 36, 14, 26] 冒泡排序 import getdata def bubbleSort(a): l=len(a)-2 i=0 while i<l

Python之常用模块(re,时间,random,os,sys,序列化模块)(Day20)

一.时间模块 #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取当前时间戳 在Python中表示时间的三种方式:时间戳,元组(struct_time), 格式化的时间字符串[时间戳为计算机能够识别的时间:时间字符串是人能够识别的时间:元组则是用来操作时间的] #导入时间模块 >>>import time #时间戳 >>>time.time() 1500875844.800804 #时间字符串 >

Python_python模块(json、os、sys、random、string、time、hashlib)

# json.os.sys.random.string.time.hashlib# json模块import json # json串就是字符串.d = { 'car': {'color': 'red', 'price': 100, 'count': 50}, '挨粪叉': {'color': 'red', 'price': 100, 'count': 50}, '挨粪叉1': {'color': 'red', 'price': 100, 'count': 50},} res = json.du

python全栈开发【第十篇】Python常用模块二(时间、random、os、sys和序列化)

一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=4, tm_sec=32, tm_wday=1, tm_yday=220, tm_isdst=0)像这样的就是结构化时间 #time模块的常用方法及三种时间之间的转换 import time # 对象:对象.方法 # --------