何为模块呢?  其实模块就是.py文件

python之所以好用就是模块多

模块分三种 :  内置模块 、 拓展模块、自定义模块、

现在我们来认识:内置模块中的 序列化模块和 hashlib  模块

1、什么是序列化:将原本的字典 列表等字类的形式转化成字符串的过程就是序列化

2、为什么序列化:

  1:以某种存储的形式使自定义对象持久化  #就好比你定义的字典的类型的内容  它可能人输入完就结束了 没有了 我们可以把它转化为字符串类型的  进行存储在文件中或者数据库中

  2:将对象从一个地方传递到另一个地方  #网络之间的信号传输你需要进行电信号传输 然后你要把你的传输内容转化为字符串类型的才可以进行传输

  3:使程序更具维护性

使用模块就需要把这些定义好的模块导入你的程序内才能使用它的功能 所以就必须使用import进行导入

实例化是创造一个实例,序列化就是创造一个序列的

eg:dic ----->str 这就是序列化的过程

python中的序列化模块:

  json:所有的编程语言都通用的序列化格式,也就是你可以把你的内容传递给java  之类的语言 它也是支持的

      缺点:它支持的数据类型非常有限,仅仅支持  数字 字符串 列表  字典

  pickle:只能在python语言中的程序之间传递数据用

      优点;pickle 支持python中的所有的数据类型的使用

  shelve  :python3X之后才有的

使用序列化模块把内容进行转化的时候把内容存储起来的一定是字符串类型的或者字节

但是进行网络传输一定是字节

对序列化进行操作的需要有四个功能;

dumps   ------->把你的内容进行序列化

loads   ------>把你的内容进行反序列化

上面两个是直接对内容进行操作 下面是对文件的进行操作

dump  -----> 把你要存进文件 内的内容进行序列化

load--------> 把你文件内的内容进行反序列化

json和pickle的读取文件是不同的  因为json读取文件是只能一行存储一个字典的  所以一次只能读取一个

也就是带s的只能对内存中的数据信息操作 不带s的对文件内的存储信息进行操作

只在内存中操作数据 主要用于网络传输 和多个数据与文件打交道

首先你要使用序列化模块你要导入模块

json 内的dumps  和  loads  :

  1. import json #导入json模块
  2. dic ={'桑塔纳':(190,80)}
  3. print(dic) #看看你所打印出来的信息 {'桑塔纳': (190, 80)}
  4. print(type(dic)) #查看你的字典的具体信息是什么 <class 'dict'>
  5. ret = json.dumps(dic) #把你的字典进行序列化 转化为字符串
  6. print(ret) #得到 {"\u6851\u5854\u7eb3": [190, 80]} 里面的内容变成两个引号的了
  7. print(type(ret)) #看看你转化后的信息就是字符串类型了 <class 'str'>
  8. # 上面是序列化下面是反序列化 就是你存储后想把这些信息提取出来 查看 或者你传递的信息想要查看 都要进行序列化
  9. res = json.loads(ret) #把你序列化后的ret进行反序列化
  10. print(res) #得到{'桑塔纳': [190, 80]}
  11. print(type(res)) #这个时候你看又回到了dic的类型 进行反序列化后又回到了最初的类型

从上面的显示中可以看出你序列化后的所有的内容都会以双引号的形式显示出来

json内的dump和load

  1. with open('序列化','w', encoding = 'UTF-8')as f : #因为json只能一次读取一个写入的字典 所以你写入的时候也要一次写入一个
  2. json.dump(dic,f,ensure_ascii=False) #这是标准语句后面必须加上 ensure_ascii = False
  3.  
  4. with open ('序列化', encoding ="UTF-8")as f :
  5. ret = json.load(f) #反序列化
  6. print(ret)
  7.  
  8. f = open('序列化', 'w', encoding = 'UTF-8')
  9. json.dump(dic,f,ensure_ascii=False)
  10. f.close()
  11.  
  12. f = open('序列化',encoding ='UTF-8')
  13. ret = json.load(f)
  14. print(ret)
  15. f.close()

你在写入文件的时候不加sure_ascii = False 存进去的就会是乱码的状态 但是你读取出来还是正常的

当你写入多个文件的时候必须要用dump和load 因为你从文件中读取的时候load只能读取一行一行的  所以你存入的时候也要想办法存储的收分行就需要在存入之前进行序列化

你要进行多个序列化然后存储到文件内 必须要转化使用dumps和loads:

  1. import json
  2. dic1= {'老大':(123)}
  3. dic2 = {'老二':(345)}
  4. dic3 ={'老三':(678)}
  5. f = open('大表哥', 'w', encoding = 'UTF-8')
  6. ret1 = json.dumps(dic1,f,ensure_ascii =False)
  7. f.write(ret1+'\n')
  8. ret2 = json.dumps(dic2,f)
  9. f.write(ret2+'\n') #不加ensure_ascii = False显示的就是会乱码但是你读取出来不会的 所以你可以选择写或者不写 ensure_ascii = False
  10. ret3 = json.dumps(dic3)
  11. f.write(ret3+'\n')
  12. f.close()
  13. f = open('大表哥', encoding = 'UTF-8')
  14. # ret = json.load(f) #这样写实惠报错的 因为load不能多行读取只能一行一行读取
  15. for line in f :
  16. print(json.loads(line.strip())) #因为你的load只能一行一行读取
  17. f.close()

反序列化必须和序列化一起使用  反序列化不能单独使用  json

json如果是对字典序列化的话  这个字典的key必须事str的不能事其他类型 

  1. dic = {"190, 90,'捏脚'":'大表哥'} #json 不支持元组 不支持除了str类型以外的key
  2. print(json.dumps(dic))
  3. 这就是错的

json除了能对字典操作外 还可以对列表元组操作

  1. dic =['','www']
  2. print(json.dumps(dic)) #结果["999", "www"]
  3.  
  4. ty = (1111)
  5. print(json.dumps(ty)) #结果1111

 

pickle模块:

dumps 和  loads

它的序列化模块不是一个可读的字符串而是一个bytes类型  就是pickle.dumps得到的内容就是bytes类型

其实pickle.dumps  loads和json的都差不多只不过pickle的存储是以字节的形式存储的

  1. import pickle
  2. dic = {(190,90,'捏脚'):'大表哥'}
  3. ret = pickle.dumps(dic)
  4. print(ret) # 结果b'\x80\x03}q\x00K\xbeKZX\x06\x00\x00\x00\xe6\x8d\x8f\xe8\x84\x9aq\x01\x87q\x02X\t\x00\x00\x00\xe5\xa4\xa7\xe8\xa1\xa8\xe5\x93\xa5q\x03s.'
  5.  
  6. print(pickle.loads(ret))

dump和 load

  1. f = open('序列化','wb')
  2. pickle.dump(dic,f)
  3. f.close()
  4. f = open('序列化', 'rb')
  5. print(pickle.load(f))
  6. f.close()
  7. # 不论是读还是写 都要以+b的形式来进行因为 pickle就是对字节进行操作的

pickle模块多写的:

  1. import pickle
  2. dic1 = {'大表哥':(190,70)}
  3. dic2 ={(222):333}
  4. dic3 = {(123):'nishou'}
  5. f = open('大表哥3', 'wb')
  6. pickle.dump(dic1,f)
  7. pickle.dump(dic2,f)
  8. pickle.dump(dic3,f)
  9. f.close()
  10.  
  11. f = open('大表哥3', 'rb') #必须以b的形式来读取
  12. while True :
  13. try:
  14. print(pickle.load(f))
  15. except EOFError:
  16. break

json模块和pickle模块两者多行写入的时候对比:

json模块在写入多次dump的时候,不能对应执行多次 load来取出数据,而pickle模块可以一次去除多个数据

json如果要写入多个元素可以先将元素 dumps序列化 ,f.write(序列化, +'\n')  来写入文件

    读取文件的时候应该按照逐行读取 再使用loads来把读出来的字符串转化为对应的数据类型

关于序列化自定义类的对象:

  1. class A:
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5.  
  6. a = A('egon', 15)
  7. import json
  8. # json.dumps(a) #报错 不可以对对象进行序列化
  9. import pickle
  10. ret = pickle.dumps(a)
  11. print(ret)
  12. obj = pickle.loads(ret)
  13. print(obj.__dict__)
  14.  
  15. import pickle
  16. # f = open('大侄子1', 'wb')
  17. # pickle.dump(a,f)
  18. # f.close()
  19. f = open('大侄子1', 'rb')
  20. # print(pickle.load(f))
  21. obj =pickle.load(f)
  22. print(obj.__dict__) #因为打的是对象只能打的是对象的地址
  23. f.close()
  1. 序列化 把数据类型变成字符串
    为什么要有序列化 因为在网络上和文件中能存在的只有字节
    json 在所有语言中通用 只对有限的数据类型进行序列化 字典 列表 字符串 数字 元组
    在多次写入dump数据进入文件的时候,不能通过load来取。
    pickle 只能在python中使用 对绝大多数数据类型都可以进行序列化
    load的时候,必须拥有被load数据类型对应的类在内存里
    dumps 序列化
    loads 反序列化
    dump 直接向文件中序列化
    load 直接对文件反序列化

shevlve 模块:

是python专有的序列化模块 只针对文件

  1. import shelve # python 专有的序列化模块 只针对文件
  2. f = shelve.open('shelve_file') # 打开文件
  3. f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据
  4. f.close()
  5.  
  6. import shelve
  7. f1 = shelve.open('shelve_file')
  8. existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
  9. f1.close()
  10. print(existing)
  11.  
  12. 设置只读方式
  13. import shelve
  14. f = shelve.open('shelve_file', flag='r')
  15. existing = f['key']
  16. f.close()
  17. print(existing)
  18.  
  19. import shelve
  20. f = shelve.open('shelve_file', flag='r')
  21. # f['key']['int'] = 50 # 不能修改已有结构中的值
  22. # f['key']['new'] = 'new' # 不能在已有的结构中添加新的项
  23. f['key'] = 'new' # 但是可以覆盖原来的结构
  24. f.close()
  25. #
  26. import shelve
  27. f1 = shelve.open('shelve_file')
  28. existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
  29. f1.close()
  30. print(existing)
  31.  
  32. import shelve
  33. f1 = shelve.open('shelve_file')
  34. print(f1['key'])
  35. f1['key']['new_value'] = 'this was not here before'
  36. f1.close()
  37.  
  38. import shelve
  39. f1 = shelve.open('shelve_file')
  40. existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
  41. f1.close()
  42. print(existing)
  43.  
  44. import shelve
  45. f2 = shelve.open('shelve_file', writeback=True)
  46. print(f2['key'])
  47. f2['key']['new_value'] = 'this was not here before'
  48. f2.close()
  49.  
  50. f1 = shelve.open('shelve_file')
  51. existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
  52. f1.close()
  53. print(existing)

hash      哈希算法 可hash数据类型——>数字的过程

hashlib模块:

hashlib  摘要算法

过程不可逆,并且在不同的时刻对同一个字符串进行加密得到的结果相同:

  

  1. 也是一些算法的集合,有好多算法
    字符串 --> 数字
    不同的字符串 --> 数字一定不同
    无论在哪台机器上,在什么时候计算,对相同的字符串结果总是一样的
    摘要过程不可逆
  2.  
  3. 先定义一个变量来等于hashlib.md5() 就是创造一个hashlib.md5()的对象 然后对这个对象传参进行一些操作
    然后再用你接受的变量.update('加密内容'.encode('UTF-8'))
    然后把你的加密内容给打印出来用hexdigest prit(变量.hexdigest())
    eg:
    你要对你好这两个字加密
    先声明你要加密的是哪种方式
    import hashlib
    m = hashlib.md5()
    m.update('nihao'.encode('UTF-8')) 这个encdoe(‘UTF-8’)可以省略不写 不写的话前面的必须是字节类型的加个b
    print(m.hexdigest())
  1. hash = hashlib.md5()#md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
  2. hash.update(bytes('admin',encoding='utf-8'))#要对哪个字符串进行加密,就放这里
  3. print(hash.hexdigest())#拿到加密字符串

hashlib进行加密的时候也可以使用字节的形式进行加盐

  1. import hashlib
  2. m =hashlib.md5('alex'.encode('utf-8'))
  3. m.update('sb'.encode('UTF-8'))
  4. print(m.hexdigest())
  5.  
  6. # m = hashlib.md5(b'bilibili')
  7. # m.update('12345'.encode('utf-8'))
  8. user = b'bilibili'
  9. m = hashlib.md5(user[::-1])
  10. m.update(''.encode('utf-8'))
  11. print(m.hexdigest())
  12.  
  13. user = b'bilibili'
  14. m = hashlib.md5(user[::-1])
  15. m.update(''.encode('utf-8'))
  16. print(m.hexdigest()) # 387ffb1c9f5bbd7ad86ab3a7a44115bf
  1.  
  2. 我们这种加太单一容易被破解 我们可以分开加密 又叫加盐
    加盐就是在第一行就对你要加密的文件进行加密 然后下面再加密一部分
  1. import hashlib
  2. m = hashlib.md5('alex'.encode('UTF-8')) #这个是盐 也就是要对下面的加密的部分再添加一个加密部分
  3. m.update('issb'.encode('UTF-8'))
  4. print(m.hexdigest())
  5.  
  6. issb加密的时候再加一个alex的盐

动态加盐:

如果还怕被破解可以根据动态加密然后根据它的下标什么的加密

  1. import hashlib
  2. n = 'alexnnnn'
  3. m = hashlib.md5(n[0:3:-1].encode('UTF-8'))
  4. m.update('issb'.encode('UTF-8'))
  5. print(m.hexdigest())

无论是加盐还是动态加盐 得到的都是他们的和

并且加盐和不加盐那么你进行加盐的字符串和不加盐的字符串一样得到的密文不一样:

  1. import hashlib
  2. s = 'nishiyigedameinv'
  3. m = hashlib.md5(s[::2].encode('UTF-8'))
  4. m.update('alex'.encode('UTF-8'))
  5. print(m.hexdigest()) # 9结果:c35f17fb25932c767dca4990f64dd0a
  6.  
  7. s = 'nishiyigedameinvalex'
  8. m = hashlib.md5()
  9. m.update(s[::2].encode('UTF-8'))
  10. print(m.hexdigest()) # 结果:fcd2ac4087c68c0dda62ec8a4e0bcbd4

一段字符串直接进行加密和分开进行加密得到的结果是相同的:

  1. import hashlib
  2. md5obj = hashlib.md5()
  3. md5obj.update(b'laowang')
  4. md5obj.update(b'your')
  5. md5obj.update(b'wife')
  6. md5obj.update(b'in')
  7. md5obj.update(b'myquilt')
  8. print(md5obj.hexdigest()) # 结果def757b8fec986c7438e72fe55a1f090
  9.  
  10. s = 'laowangyourwifeinmyquilt'
  11. md5obj = hashlib.md5()
  12. md5obj.update(s.encode('UTF-8'))
  13. print(md5obj.hexdigest()) # 结果ef757b8fec986c7438e72fe55a1f090

写一个函数来确定你的两个数值一样不

  1. import hashlib
  2. def func(filename):
  3. m = hashlib.md5()
  4. m.update(filename.encode('UTF-8'))
  5. return m.hexdigest()
  6. a = 'laowang'
  7. b = 'laowang'
  8. # print(func(a))# b1132aa640bd78495f38f611d7cc0d19
  9. # print(func(b)) # b1132aa640bd78495f38f611d7cc0d19
  10. if func(a) == func(b):
  11. print(True)
  12. else:
  13. print('False')
  1.  
  2. 经典代码:
  1. import hashlib
  2. # md5算法 通用的算法
  3. # sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高,
  4. # 得到的数字结果越长,计算的时间越长
  5. m = hashlib.md5()
  6. m.update('alex3714'.encode('utf-8'))
  7. print(m.hexdigest())
  8.  
  9. m = hashlib.md5()
  10. m.update('dazhizi sha'.encode('utf-8'))
  11. print(m.hexdigest())
  12.  
  13. m = hashlib.md5()
  14. m.update(''.encode('utf-8'))
  15. print(m.hexdigest())
  16.  
  17. # 将所有常见的密码 md5摘要
  18. # 密码 摘要结果
  19. # 暴力破解 和 撞库
  20.  
  21. # 加盐
  22. m = hashlib.md5('wahaha'.encode('utf-8'))
  23. m.update(''.encode('utf-8'))
  24. print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c
  25.  
  26. #
  27. m = hashlib.md5('wahaha'.encode('utf-8'))
  28. m.update(''.encode('utf-8'))
  29. print(m.hexdigest())
  30.  
  31. # 动态加盐
  32. # 500 用户名 和 密码
  33. #
  34. # 111111 d1c59b7f2928f9b1d63898133294ad2c
  35. # pwd username
  36. username = 'alex'
  37. m = hashlib.md5(username[:2:2].encode('utf-8'))
  38. m.update(''.encode('utf-8'))
  39. print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c
  40.  
  41. # 文件的一致性校验 周一讲

还有一个sha模块 也是加密  一般都是sha1加密和md5加密一样的使用  这个更加不难被破解

不同的加密方法得到的密文不一样 ,但是一般都用md5  因为它速度快

  1. import hashlib
  2. m = hashlib.sha1()
  3. m.update(b'')
  4. m.update(''.encode('UTF-8'))
  5. print(m.hexdigest())

面向对象进阶------>模块 json pickle hashlib的更多相关文章

  1. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

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

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  3. Python常用模块——json & pickle

    序列化模块 1.什么是序列化-------将原本的字典,列表等对象转换成一个字符串的过程就叫做序列化 2.序列化的目的 1.以某种存储形式使自定义对象持久化 2.将对象从一个地方传递到另一个地方 3. ...

  4. python3模块: json & pickle

    概念: 序列化(Serialization): 将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反序列化对象的 ...

  5. python模块--json \ pickle \ shelve \ XML模块

    一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...

  6. 模块 - json/pickle/shelve/xml/configparser

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...

  7. python开发模块基础:序列化模块json,pickle,shelve

    一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...

  8. python序列化模块 json&&pickle&&shelve

    #序列化模块 #what #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程叫做序列化. #why #序列化的目的 ##1.以某种存储形式使自定义对象持久化 ##2.将对象从一个地方传递 ...

  9. os模块/sys模块/json/pickle模块/logging模块(day16整理)

    目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...

随机推荐

  1. 第3章—高级装配—条件化的Bean

    条件化的Bean 通过活动的profile,我们可以获得不同的Bean.Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. @Conditional根 ...

  2. vue测试安装和配置

    npm install --save-dev @vue/test-utils mocha mocha-webpack npm install --save-dev jsdom jsdom-global ...

  3. xcode发布ipa

    --------Xcode------- product 产品 archive 存档 (等) distribute app 分发app development 开发者 next next (等 比较漫 ...

  4. C# OracleHelper

    using System; using System.Configuration; using System.Data; using System.Collections; using Oracle. ...

  5. linux系统挂载U盘,中文文件名乱码解决方案

    本人(壮壮熊)所用系统:ubuntu 12.4 今天在使用mount指令挂在硬盘时,出现令人头疼的中文文件名乱码. 问题: 使用mount /dev/sdb1 /media指令挂在第二颗硬盘的第一个分 ...

  6. redis的数据类型(一) key操作

      redis是一个key-value形式的数据缓存,因此包括key和value. 一.key的说明 1.redis的key   Redis的key是字符串类型,但是key中不能包括边界字符,由于ke ...

  7. CNN理解与实现

    CNN理解与实现 组成部分 Convolution Layer Pool Layer: Max-pooling layer Average-pooling layer Full Connected(F ...

  8. [PY3]——基本语法

    Python3基本语法-xmind图 常量/变量 1. 常量:一旦赋值就不可再改变.不能对它重新赋值.python不存在常量2. 字面常量:一个单独出现的量,未赋值给任何变量或常量3. 变量: i=3 ...

  9. Python(1):入门

    安装: 在linux中一般都自带有python2.7的版本,如果想升级python到最新的版本可以参考其他博客(http://www.cnblogs.com/lanxuezaipiao/archive ...

  10. vue做的简单购物车

    <code><!DOCTYPE html><html><head lang="en"> <meta charset=" ...