序列化 ,hashlib ,configparser ,logging ,collections模块
# 实例化 归一化 初始化 序列化 # 列表 元组 字符串# 字符串# .......得到一个字符串的结果 过程就叫序列化# 字典 / 列表 / 数字 /对象 -序列化->字符串# 为什么要序列化 # 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模块的更多相关文章
- python 全栈开发,Day26(hashlib文件一致性,configparser,logging,collections模块,deque,OrderedDict)
一.hashlib文件一致性校验 为何要进行文件一致性校验? 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进 ...
- configparser logging collections 模块
configparser 模块: 这是一个写入的模块就是把你的信息给写入的模块 #这是一个把信息写入example文件内import configparserconfig = configparser ...
- 常用模块(hashlib,configparser,logging)
常用模块(hashlib,configparser,logging) hashlib hashlib 摘要算法的模块md5 sha1 sha256 sha512摘要的过程 不可逆能做的事:文件的一致性 ...
- 内置函数 hashlib configparser logging 模块 C/S B/S架构
1.内置函数 # 内置的方法有很多 # 不一定全都在object中 # class Classes: # def __init__(self,name): # self.name = name # s ...
- 4-23 模块 hashlib ,configparser,loging,collections
1,hashlib模块的补充(摘要算法) 1,Sha1的用法和md5的类似,通常用一个40位的16进制字符串表示.比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度 ...
- 模块 -- 序列化 hashlib sha logging (加密 加盐 )
模块: 一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...
- hashlib,configparser,logging模块
一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- hashlib,configparser,logging,模块
一,hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...
- 常用模块(subprocess/hashlib/configparser/logging/re)
一.subprocess(用来执行系统命令) import os cmd = r'dir D:xxx | findstr "py"' # res = subprocess.Pope ...
随机推荐
- asp.net mvc 快捷下拉列表
各种表单中可能经常会遇到使用各种下拉列表的地方, 有些数据是从数据库来的, 有些则是固定数值, 为了方便, 快速的构造一个可以保持状态的下拉列表, 就出现了下面的方法 2分钟构思的代码, 比较粗糙, ...
- VS2015 Release 生成调试信息
- C/C++ > 常规 > 调试信息格式 - C/C++ > 优化 > 优化 > 禁止(/Od) - 链接器 > 调试 > 生成调试信息 > 是 (/ ...
- [LeetCode&Python] Problem 867. Transpose Matrix
Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...
- Photoshop通道抠出散乱的儿童头发
抠图之前仔细分析是必不可少的.要了解清楚需要抠取部分的构成,然后选择最快捷的方法.教程素材图片人物头发色调比较单一,背景色也比较单一,用通道抠图是非常快捷的. 最终效果1 最终效果2 原图 一.复制图 ...
- Cassandra 数据库, python cqlsh命令
★ cql操作数据库(cqlsh.bat: python cqlsh命令操作<优缺点:https://blog.csdn.net/vbirdbest/article/details/77662 ...
- spring boot 好文
配置: https://www.jianshu.com/p/3af2a8721d86 : Spring Boot启动报错:Whitelabel Error Page 分页: https://bbs.c ...
- winform datagridview 不显示默认第一列 不显示未绑定列 数据源发生改变时自动更新 (转)
不显示带星号的第一列: datagridview属性框中将 RowHeadersVisiber 设置为 false 不显示未绑定列: datagridview有一个属性是 AutoGenerateC ...
- Entity创建一对一关系
Area类 public virtual User User { get; set; } User类 public virtual Area Area { get; set; } Context类 m ...
- ML(4.2): R CART
CART模型 :即Classification And Regression Trees.它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据挖掘中的一种常用算法.如果因变量是连续数据,相 ...
- meta标签和JS实现页面刷新与重定向
下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 1 2 3 4 5 6 <head& ...