# 实例化  归一化 初始化 序列化    # 列表 元组 字符串# 字符串# .......得到一个字符串的结果 过程就叫序列化# 字典 / 列表 / 数字 /对象 -序列化->字符串# 为什么要序列化    # 1.要把内容写入文件 序列化    # 2.网络传输数据     序列化# 字符串-反序列化->字典 / 列表 / 数字 /对象

# 方法# dic = {'k':'v'}# str_dic = str(dic)# print(dict(str_dic))# print([eval(str_dic)])# eval不能随便用

# jsonimport json# 只提供四个方法# dic = {'aaa':'bbb','ccc':'ddd'}# str_dic = json.dumps(dic)# print(dic)# print(str_dic,type(str_dic))# with open('json_dump','w') as f:#     f.write(str_dic)# ret = json.loads(str_dic)# print(ret,type(ret))# print(ret['aaa'])

# dic = {'aaa':'bbb','ccc':'ddd'}# with open('json_dump2','w') as f:#     json.dump(dic,f)

# with open('json_dump2') as f:#     print(type(json.load(f)))
import json# json格式的限制1,json格式的key必须是字符串数据类型# json格式中的字符串只能是""

# 如果是数字为key,那么dump之后会强行转成字符串数据类型# dic = {1:2,3:4}# str_dic = json.dumps(dic)# print(str_dic)# new_dic = json.loads(str_dic)# print(new_dic)

# json是否支持元组,对元组做value的字典会把元组强制转换成列表# dic = {'abc':(1,2,3)}# str_dic = json.dumps(dic)# print(str_dic)# new_dic = json.loads(str_dic)# print(new_dic)

# json是否支持元组做key,不支持# dic = {(1,2,3):'abc'}# str_dic = json.dumps(dic)  # 报错

# 对列表的dump# lst = ['aaa',123,'bbb',12.456]# with open('json_demo','w') as f:#     json.dump(lst,f)# with open('json_demo') as f:#     ret = json.load(f)#     print(ret)

# 能不能多次dump数据到文件里,可以多次dump但是不能load出来了# dic = {'abc':(1,2,3)}# lst = ['aaa',123,'bbb',12.456]# with open('json_demo','w') as f:#     json.dump(lst,f)#     json.dump(dic,f)# with open('json_demo') as f:#     ret = json.load(f)#     print(ret)

# 想dump多个数据进入文件,用dumps# dic = {'abc':(1,2,3)}# lst = ['aaa',123,'bbb',12.456]# with open('json_demo','w') as f:#     str_lst = json.dumps(lst)#     str_dic = json.dumps(dic)#     f.write(str_lst+'\n')#     f.write(str_dic+'\n')

# with open('json_demo') as f:#     for line in f:#         ret = json.loads(line)#         print(ret)

# 中文格式的 ensure_ascii = False# dic = {'abc':(1,2,3),'country':'中国'}# ret = json.dumps(dic,ensure_ascii = False)# print(ret)# dic_new = json.loads(ret)# print(dic_new)

# with open('json_demo','w',encoding='utf-8') as f:#     json.dump(dic,f,ensure_ascii=False)

# json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间# import json# data = {'username':['李华','二愣子'],'sex':'male','age':16}# json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)# print(json_dic2)

# set不能被dump/dumps

********************************************************************************************
import  pickle# dump的结果是bytes,dump用的f文件句柄需要以wb的形式打开,load所用的f是'rb'模式# 支持几乎所有对象的序列化# 对于对象的序列化需要这个对象对应的类在内存中# 对于多次dump/load的操作做了良好的处理

# pic_dic = pickle.dumps(dic)# print(pic_dic)    # bytes类型# new_dic = pickle.loads(pic_dic)# print(new_dic)

# pickle支持几乎所有对象的# class Student:#     def __init__(self,name,age):#         self.name = name#         self.age = age## alex = Student('alex',83)# ret = pickle.dumps(alex)# 小花 = pickle.loads(ret)# print(小花.name)# print(小花.age)

# class Student:#     def __init__(self,name,age):#         self.name = name#         self.age = age## alex = Student('alex',83)# with open('pickle_demo','wb') as f:#     pickle.dump(alex,f)# with open('pickle_demo','rb') as f:#     旺财 = pickle.load(f)#     print(旺财.name)

# 学员选课系统  pickle模块来存储每个学员的对象

# with open('pickle_demo','wb') as f:#     pickle.dump({'k1':'v1'}, f)#     pickle.dump({'k11':'v1'}, f)#     pickle.dump({'k11':'v1'}, f)#     pickle.dump({'k12':[1,2,3]}, f)#     pickle.dump(['k1','v1','l1'], f)

# with open('pickle_demo','rb') as f:#     while True:#         try:#             print(pickle.load(f))#         except EOFError:#             break
******************************************************************************************** 
import shelvef = shelve.open('shelve_demo')f['key'] = {'k1':(1,2,3),'k2':'v2'}f.close()

# f = shelve.open('shelve_demo')# content = f['key']# f.close()# print(content)

# shelve  如果你写定了一个文件# 改动的比较少# 读文件的操作比较多# 且你大部分的读取都需要基于某个key获得某个value
********************************************************************************************  

# 摘要算法的模块import hashlib# 能够把 一个 字符串 数据类型的变量# 转换成一个 定长的 密文的 字符串,字符串里的每一个字符都是一个十六进制数字

# 对于同一个字符串,不管这个字符串有多长,只要是相同的,# 无论在任何环境下,多少次执行,在任何语言中# 使用相同的算法\相同的手段得到的结果永远是相同的# 只要不是相同的字符串,得到的结果一定不同

# 登录的密文验证# 'alex3714'  # -> '127649364964908724afd'

# 字符串 --> 密文# 密文 不可逆的 字符串

# 1234567 - > '127649364964908724afd'# 算法 : 对于同一个字符串,用相同的算法,相同的手段去进行摘要,获得的值总是相同的# 1234567 - > '127649364964908724afd'

# s1 = 'alex3714'  # aee949757a2e698417463d47acac93df# s2 = 'alex3714qwghkdblkasjbvkhoufyowhdjlbvjnjxc'  # d2d087c10aeba8276b21f8697ad3e810# md5是一个算法,32位的字符串,每个字符都是一个十六进制# md5算法 效率快 算法相对简单# md5_obj = hashlib.md5()# md5_obj.update(s1.encode('utf-8'))# res = md5_obj.hexdigest()# print(res,len(res),type(res))

# 数据库 - 撞库# 111111 --> 结果# 666666# 123456# alex3714 --> aee949757a2e698417463d47acac93df

# s1 = '123456'# md5_obj = hashli b.md5()# md5_obj.update(s1.encode('utf-8'))# res = md5_obj.hexdigest()# print(res,len(res),type(res))

# 加盐  # alex3714  d3cefe8cdd566977ec41566f1f11abd9# md5_obj = hashlib.md5('任意的字符串作为盐'.encode('utf-8'))# md5_obj.update(s1.encode('utf-8'))# res = md5_obj.hexdigest()# print(res,len(res),type(res))

# 恶意用户 注册500个账号# 张三|123456  '任意的字符串作为盐'.encode('utf-8') d3cefe8cdd566977ec41566f1f11abd8# 李四|111111

# 动态加盐# username = input('username : ')# passwd = input('password : ')# md5obj = hashlib.md5(username.encode('utf-8'))# md5obj.update(passwd.encode('utf-8'))# print(md5obj.hexdigest())# ee838c58e5bb3c9e687065edd0ec454f

# sha1也是一个算法,40位的字符串,每个字符都是一个十六进制# 算法相对复杂 计算速度也慢# md5_obj = hashlib.sha1()# md5_obj.update(s1.encode('utf-8'))# res = md5_obj.hexdigest()# print(res,len(res),type(res))

# 文件的一致性校验# md5_obj = hashlib.md5()# with open('5.序列化模块_shelve.py','rb') as f:#     md5_obj.update(f.read())#     ret1 = md5_obj.hexdigest()## md5_obj = hashlib.md5()# with open('5.序列化模块_shelve.py.bak','rb') as f:#     md5_obj.update(f.read())#     ret2 = md5_obj.hexdigest()# print(ret1,ret2)

# 如果这个文件特别大,内存装不下# 8g 10g# 按行读  文本 视频 音乐 图片 bytes# 按字节读 23724873 10240

# md5_obj = hashlib.md5()# md5_obj.update('hello,alex,sb'.encode('utf-8'))# print(md5_obj.hexdigest())

# md5_obj = hashlib.md5()# md5_obj.update('hello,'.encode('utf-8'))# md5_obj.update('alex,'.encode('utf-8'))# md5_obj.update('sb'.encode('utf-8'))# print(md5_obj.hexdigest())

# 大文件的已执行校验

md5_obj = hashlib.md5()with open('5.序列化模块_shelve.py.bak','rb') as f:    md5_obj.update(f.read())    # 循环 循环的读取文件内容    # 循环的来updateprint(md5_obj.hexdigest())********************************************************************************************

import configparser# file类型# f = open('setting')

# 有一种固定格式的配置文件# 有一个对应的模块去帮你做这个文件的字符串处理

# settings.py 配置

# import configparser## config = configparser.ConfigParser()## config["DEFAULT"] = {'ServerAliveInterval': '45',#                       'Compression': 'yes',#                      'CompressionLevel': '9',#                      'ForwardX11':'yes'#                      }## config['bitbucket.org'] = {'User':'hg'}## config['topsecret.server.com'] = {'Host Port':'50022','ForwardX11':'no'}## with open('example.ini', 'w') as f:#    config.write(f)

import configparser

config = configparser.ConfigParser()# print(config.sections())        #  []config.read('example.ini')# print(config.sections())        #   ['bitbucket.org', 'topsecret.server.com']# print('bytebong.com' in config) # False# print('bitbucket.org' in config) # True# print(config['bitbucket.org']["user"])  # hg# print(config['DEFAULT']['Compression']) #yes# print(config['topsecret.server.com']['ForwardX11'])  #no# print(config['bitbucket.org'])          #<Section: bitbucket.org># for key in config['bitbucket.org']:     # 注意,有default会默认default的键#     print(key)# print(config.options('bitbucket.org'))  # 同for循环,找到'bitbucket.org'下所有键# print(config.items('bitbucket.org'))    #找到'bitbucket.org'下所有键值对# print(config.get('bitbucket.org','compression')) # yes get方法Section下的key对应的value
********************************************************************************************import logging
# 功能    # 1. 日志格式的规范    # 2. 操作的简化    # 3. 日志的分级管理

# logging不能帮你做的事情    # 自动生成你要打印的内容# 需要程序员自己在开发的时候定义好 :    # 在哪些地方需要打印,要打印的内容是什么,内容的级别

# logging模块的使用 :    # 普通配置型 简单的 可定制化差    # 对象配置型 复杂的 可定制化强

# 认识日志分级

# import logging# logging.debug('debug message')      # 调试模式# logging.info('info message')        # 基础信息# logging.warning('warning message')  # 警告# logging.error('error message')      # 错误# logging.critical('critical message')# 严重错误

# import logging# logging.basicConfig(level=logging.DEBUG)# logging.debug('debug message')      # 调试模式# logging.info('info message')        # 基础信息# logging.warning('warning message')  # 警告# logging.error('error message')      # 错误# logging.critical('critical message')# 严重错误

# import logging# logging.basicConfig(level=logging.DEBUG,#                     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',#                     datefmt='%a, %d %b %Y %H:%M:%S',#                     filename='test.log')# logging.debug('debug message')      # 调试模式# logging.info('info message')        # 基础信息# logging.warning('warning message')  # 警告# logging.error('error message')      # 错误# logging.critical('critical message')# 严重错误

# basicConfig# 不能将一个log信息既输出到屏幕 又输出到文件

# logger对象的形式来操作日志文件

# 创建一个logger对象# 创建一个文件管理操作符# 创建一个屏幕管理操作符# 创建一个日志输出的格式

# 文件管理操作符 绑定一个 格式# 屏幕管理操作符 绑定一个 格式

# logger对象 绑定 文件管理操作符# logger对象 绑定 屏幕管理操作符

# import logging# # 创建一个logger对象# logger = logging.getLogger()# # 创建一个文件管理操作符# fh = logging.FileHandler('logger.log',encoding='utf-8')# # 创建一个屏幕管理操作符# sh = logging.StreamHandler()# # 创建一个日志输出的格式# format1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# # # 文件管理操作符 绑定一个 格式# fh.setFormatter(format1)# # 屏幕管理操作符 绑定一个 格式# sh.setFormatter(format1)# logger.setLevel(logging.DEBUG)# # logger对象 绑定 文件管理操作符# logger.addHandler(fh)# # logger对象 绑定 屏幕管理操作符# logger.addHandler(sh)# # logger.debug('debug message')      # 调试模式# logger.info('我的信息')        # 基础信息# logger.warning('warning message')  # 警告# logger.error('error message')      # 错误# logger.critical('critical message')# 严重错误

import logginga=logging.getLogger()fh=logging.FileHandler('a1',encoding='utf-8')sh=logging.StreamHandler()

format1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(format1)sh.setFormatter(format1)

a.setLevel(logging.DEBUG)

a.addHandler(fh)a.addHandler(sh)

a.debug('debug message')      # 调试模式a.info('我的信息')        # 基础信息a.warning('warning message')  # 警告a.error('error message')      # 错误a.critical('critical message')# 严重错误

input("")import logginglogging.basicConfig(level=logging.DEBUG,   #修改 DEBUG,INFO                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',                    datefmt='%a, %d %b %Y %H:%M:%S')exp = 3+4/4logging.debug(str(4/4))print(4)********************************************************************************************

# collections模块# 数据类型的扩展模块

# 什么是队列# 先进先出# import queue# q = queue.Queue()# print(q.qsize())# q.put(1)# q.put('a')# q.put((1,2,3))# q.put(({'k':'v'}))# print(q.qsize())# print('q : ',q)# print('get : ',q.get())# print(q.qsize())

# deque 双端队列# from collections import deque# dq = deque()# dq.append(2)# dq.append(5)# dq.appendleft('a')# dq.appendleft('b')# print(dq)# # print(dq.pop())# # print(dq)# # print(dq.popleft())# # print(dq)# print(dq.remove('a'))# print(dq.insert(2,'123'))# print(dq)

# 总结# 在insert remove的时候 deque的平均效率要高于列表# 列表根据索引查看某个值的效率要高于deque# append 和pop对于列表的效率是没有影响
												

序列化 ,hashlib ,configparser ,logging ,collections模块的更多相关文章

  1. python 全栈开发,Day26(hashlib文件一致性,configparser,logging,collections模块,deque,OrderedDict)

    一.hashlib文件一致性校验 为何要进行文件一致性校验? 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进 ...

  2. configparser logging collections 模块

    configparser 模块: 这是一个写入的模块就是把你的信息给写入的模块 #这是一个把信息写入example文件内import configparserconfig = configparser ...

  3. 常用模块(hashlib,configparser,logging)

    常用模块(hashlib,configparser,logging) hashlib hashlib 摘要算法的模块md5 sha1 sha256 sha512摘要的过程 不可逆能做的事:文件的一致性 ...

  4. 内置函数 hashlib configparser logging 模块 C/S B/S架构

    1.内置函数 # 内置的方法有很多 # 不一定全都在object中 # class Classes: # def __init__(self,name): # self.name = name # s ...

  5. 4-23 模块 hashlib ,configparser,loging,collections

    1,hashlib模块的补充(摘要算法) 1,Sha1的用法和md5的类似,通常用一个40位的16进制字符串表示.比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度 ...

  6. 模块 -- 序列化 hashlib sha logging (加密 加盐 )

    模块:  一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...

  7. hashlib,configparser,logging模块

    一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...

  8. hashlib,configparser,logging,模块

    一,hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  9. 常用模块(subprocess/hashlib/configparser/logging/re)

    一.subprocess(用来执行系统命令) import os cmd = r'dir D:xxx | findstr "py"' # res = subprocess.Pope ...

随机推荐

  1. spring jdbc配置文件进行加密解密

    最近做一个项目,安全上有点要求,就是要对数据库相关的配置进行加密,配置文件如下: #加密前#datasource.type=mysql #datasource.driverClassName=com. ...

  2. 清除的通用样式 css

    /*公共样式--开始*/ html, body, div, ul, li, h1, h2, h3, h4, h5, h6, p, dl, dt, dd, ol, form, input, textar ...

  3. IO练习--按字节截取字符串

    * 在Java中字符串“abcd”和字符串“ab你好”都是4个字符, * 但是字节数不同,因为GBK中一个汉字占两个字节 * 定义一个方法用来按字节数截取字符串. * 如:对于“ab你好”,取3个字节 ...

  4. utf-8编码的csv文件,用excel打开乱码,解决办法,在输出前加 0xEF,0xBB,0xBF三个char

    转自 http://blog.csdn.net/zcmssd/article/details/6086649 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO ...

  5. (2)字符编码关系和转换(bytes类型)

    ASCII 占一个字节,只支持英文 GB2312 占2个字节,只支持6700+汉字 GBK 是GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符编码 ks_c-5601-1987 ...

  6. hdu1224 dp(dp + 栈/父亲数组记录路径)

    题意:给定 n 个城市的有趣度,并给出可以从那些城市飞到那些城市.其中第一个城市即起始城市同样也作为终点城市,有趣度为 0,旅行途中只允许按有趣度从低到高旅行,问旅行的有趣度最大是多少,并输出旅行路径 ...

  7. xsl -fo 了解

    XSL-FO是用于格式化XML数据的语言,全称为Extensible Stylesheet Language Formatting Objects(格式化对象的可扩展样式表语言),是W3C参考标准,现 ...

  8. FastAdmin 插件的 Git 开发流程(简明)

    FastAdmin 插件的 Git 开发流程(简明) cms zip 安装 包安装 删除 addons 里的 cms 使用 mklink 软链接到 cms 插件 Git 仓库 修改 cms 插件 gi ...

  9. 文件上传 accept 兼容性

    写法1 在chrome下有反应很慢的问题,不要使用 写法2 在firefox.Safari 中有兼容性问题,弹出选择框不会高亮显示jpg后缀的图片 写法3 在写法2上都添加了image/jpeg,解决 ...

  10. django模板里关闭特殊字符转换,在前端以html语法渲染

    变量 pagination_html是一个方法返回的html代码,需要在前端渲染出来,不是当字符串显示 <!-- /.box-body --> {% autoescape off %} { ...