# 实例化  归一化 初始化 序列化    # 列表 元组 字符串# 字符串# .......得到一个字符串的结果 过程就叫序列化# 字典 / 列表 / 数字 /对象 -序列化->字符串# 为什么要序列化    # 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. 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)

    原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...

  2. 【error】Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs.

    前言 使用matlab通过摄像头获取图像进行处理: 问题描述 使用matalb调用摄像头时出现错误: >> imaqhwinfo Warning: No Image Acquisition ...

  3. JQuery实时监控文本框字符变化

    $(function(){ $('input[name="addr"]').on('input propertychange', function() { if ($('input ...

  4. 移动端 元素外面使用伪类after加边框 导致其内部元素无法选中

    解决方法:给内部元素增加属性 position: relative; z-index: 3; 这样就能选中其内部元素了.

  5. ARP命令详解

    ARP是一个重要的TCP/IP协议,并且用于确定对应IP地址的网卡物理地址.实用arp命令,我们能够查看本地计算机或另一台计算机的ARP高速缓存中的当前内容.此外,使用arp命令,也可以用人工方式输入 ...

  6. 为什么要用MQ

    现在公司系统在做微服务化,很多人在设计服务间通信时都会想到用MQ,然而有些人居然说不清楚为啥要用MQ? 其实用它主要是两点考虑: 1.应用解耦:两个服务间通过MQ通信,可以不用完全知道对方的存在,实现 ...

  7. vue 回车自动登录

    原理: 在密码输入框加入事件:@keyup.enter.native 登录button加入事件:@click 代码: pug 语法: el-form(ref="loginForm" ...

  8. Spring MVC 向页面传值-Map、Model、ModelMap、ModelAndView

    Spring MVC 向页面传值,有4种方式: ModelAndView Map Model ModelMap 使用后面3种方式,都是在方法参数中,指定一个该类型的参数. Model Model 是一 ...

  9. Java8 lam。。。表达式

    双冒号:相当于用了别人实现的方法,格式,类名::方法 Math::max等效于(a, b)->Math.max(a, b)String::startWith等效于(s1, s2)->s1. ...

  10. CentOS6.8 x64+Nginx1.3.8/Apache-httpd 2.4.3+PHP5.4.8(php-fpm)+MySQL5.5.28+CoreSeek4.1源码编译安装

    系统为CentOS6.8 x64服务器版精简安装. 准备工作 部署安装目录 /usr/local/* /var/lib/* /var/lib64/* 下载源文件 #cd /usr/local/src ...