序列化 ,hashlib ,configparser ,logging ,collections模块

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

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

# json
import 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 shelve
f = 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())
# 循环 循环的读取文件内容
# 循环的来update
print(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 logging
a=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 logging
logging.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/4
logging.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对于列表的效率是没有影响
























猜你喜欢

转载自www.cnblogs.com/xdlzs/p/9461822.html