# 实例化 归一化 初始化 序列化 # 列表 元组 字符串# 字符串# .......得到一个字符串的结果 过程就叫序列化# 字典 / 列表 / 数字 /对象 -序列化->字符串# 为什么要序列化 # 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对于列表的效率是没有影响
原文地址:https://www.cnblogs.com/xdlzs/p/9461822.html
时间: 2024-10-11 05:02:55