复习
上节课复习: 1、包 什么是包:包就是一个含有__init__.py文件的文件夹 包是模块的一种形式,即包是用来被导入的,但包的本质就是一个文件夹(文件夹的作用就是用来存放文件的,包内所有的文件都是用来被导入使用的) import 包 包.名字 导入方式: 1、绝对导入: 相对于执行文件所在的文件夹 2、相对导入:相对于当前被导入的文件(只能用于模块之间的互相导入) . .. 2、日志模块logging 1、logger:产生日志 2、filter 3、handler:接收logger对象传来的日志,控制输出到不同的位置 4、formatter:控制handler对象输出日志的格式 debug 10 info 20 warning 30 error 40 critical 50 今日内容: 序列化json与pickle 时间模块time与datetime 随机值random sys os re模块
logging
""" logging配置 """ import os BASE_DIR=os.path.dirname(os.path.abspath(__file__)) # 定义三种日志输出格式 开始 standard_format = '%(asctime)s - %(filename)s:%(lineno)d - %(name)s - %(levelname)s - %(message)s' simple_format = '%(asctime)s - %(levelname)s - %(message)s' id_simple_format = '[%(asctime)s] %(message)s' # log文件的全路径 logfile1_path = os.path.join(BASE_DIR,'a1.log') logfile2_path = os.path.join(BASE_DIR,'a2.log') logfile3_path = os.path.join(BASE_DIR,'a3.log') logfile4_path = os.path.join(BASE_DIR,'a4.log') # log配置字典 LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'formatter1': { 'format': standard_format }, 'formatter2': { 'format': simple_format }, }, 'filters': {}, 'handlers': { #打印到终端的日志 'sm': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'formatter2' }, #打印到文件的日志,收集info及以上的日志 'h1': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': logfile1_path, # 日志文件 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, 'h2': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': logfile2_path, # 日志文件 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, 'h3': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': logfile3_path, # 日志文件 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, 'h4': { 'level': 'DEBUG', 'class': 'logging.FileHandler', # 保存到文件 'formatter': 'formatter1', 'filename': logfile4_path, # 日志文件 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, }, 'loggers': { #logging.getLogger(__name__)拿到的logger配置 '': { 'handlers': ['h1','h2','sm','h4'], 'level': 'DEBUG', 'propagate': False, # 向上(更高level的logger)传递 }, 'egon':{ 'handlers': ['h3',], 'level': 'DEBUG', 'propagate': False, # 向上(更高level的logger)传递 }, }, }
import logging.config from dir1.dir2 import settings logging.config.dictConfig(settings.LOGGING_DIC) logger1=logging.getLogger('用户相关') #name='用户相关' logger2=logging.getLogger('交易日志') #name='交易日志' logger3=logging.getLogger('egon') #name='交易日志' logger4 = logging.getLogger('徐金金测试') logger1.info('xxx登陆成功') logger2.info('Egon给李杰转账100块') logger3.info('egon。。。。。。。。。。。。') logger4.info('test ...........') try: print(1) print(2) print(3) xxxxx except NameError as e: # e="name 'xxxxx' is not defined" logger1.error(e) print(4) print(5) print(6)
json pickle
01 什么是序列化/反序列化 序列化就是将内存中的数据结构转换成一种中间格式存储到硬盘或者基于网络传输 反序列化就是硬盘中或者网络中传来的一种数据格式转换成内存中数据结构 02 为什要有 1、可以保存程序的运行状态 2、数据的跨平台交互 03 怎么用 json 优点: 跨平台性强 缺点: 只能支持/对应python部分的数据类型(元组 集合 不支持) pickle 优点: 可以支持/对应所有python的数据类型 缺点: 只能被python识别,不能跨平台
# import json # dic={'name':'egon','age':18,'sex':'male'} #序列化:内存中的数据类型------>中间格式json # # 1、序列化得到json_str # json_str=json.dumps(dic) # print(dic,type(dic)) # print(json_str,type(json_str)) # # 2、把json_str写入文件 # with open('db.json','wt',encoding='utf-8') as f: # f.write(json_str) #1和2合为一步 # with open('db.json','wt',encoding='utf-8') as f: # json.dump(dic,f) # print(json_str,type(json_str)) # json格式不能识别单引号,全都是双引号 #原值没有改变 json.dumps json.dump
# import json #反序列化:中间格式json-----》内存中的数据类型 # #1、从文件中读取json_str # with open('db.json','rt',encoding='utf-8') as f: # json_str=f.read() # #2、将json_str转成内存中的数据类型 # dic=json.loads(json_str) #1和2可以合作一步 # with open('db.json','rt',encoding='utf-8') as f: # dic=json.load(f) # # print(dic['sex']) #ps:json.loads json.load
# json格式不能识别单引号,全都是双引号 # import json # with open('db1.json','rt',encoding='utf-8') as f: # json.load(f) # json.loads('{"name":"egon"}') # with open('db.json','wt',encoding='utf-8') as f: # l=[1,True,None] # json.dump(l,f) # 用json反序列化 # with open('db.json','rt',encoding='utf-8') as f: # l=json.load(f) # print(l) # 用eval反列化 # with open('db.json','rt',encoding='utf-8') as f: # s=f.read() #s ='[1, true, null]' # dic=eval(s) #eval('[1, true, null]') # print(dic['name']) #ps: json eval
# import pickle # dic={'a':1,'b':2,'c':3} # #1 序列化 # pkl=pickle.dumps(dic) # print(pkl,type(pkl)) # print(dic,type(dic)) # # #2 写入文件 # with open('db.pkl','wb') as f: # f.write(pkl) #1和2可以合作一步 # with open('db.pkl','wb') as f: # pickle.dump(dic,f) #ps: pickle.dumps pickle.dump bytes数据类型
# import pickle # # #1、从文件中读取pickle格式 # with open('db.pkl','rb') as f: # pkl=f.read() # #2、将json_str转成内存中的数据类型 # dic=pickle.loads(pkl) # print(dic['a']) #1和2可以合作一步 # with open('db.pkl','rb') as f: # dic=pickle.load(f) # # # print(dic,dic['a']) # import json,pickle #json 不支持元组 集合 # s={1,2,3} # json.dumps(s) # pickle.dumps(s) #ps: pickle.loads pickle.load
time datetime
# import time # 时间分为三种格式 #1、时间戳 # start= time.time() # time.sleep(3) # stop= time.time() # print(stop - start) #2、格式化的字符串形式 # print(time.strftime('%Y-%m-%d %X')) # print(time.strftime('%Y-%m-%d %H:%M:%S %p')) #3、 结构化的时间/时间对象 # t1=time.localtime() # print(t1) # print(type(t1.tm_min)) # print(t1.tm_mday) # t2=time.gmtime() # print(t1) # print(t2) # 时间转换 # print(time.localtime(123123123)) # print(time.gmtime(123123123)) # print(time.mktime(time.localtime())) # print(time.strftime('%Y',time.localtime())) # print(time.strptime('2011-03-07','%Y-%d-%m')) # print(time.asctime()) # print(time.ctime()) # print(time.strftime('%a %b %d %H:%M:%S %Y')) # print(time.asctime(time.localtime())) # print(time.ctime(123123123)) # print(time.strftime('%Y-%m-%d %X')) # 获取格式化字符串形式的时间麻烦 # 时间戳与格式化时间之间的转换麻烦 # 获取之前或者未来的时间麻烦 # import datetime # print(datetime.datetime.now()) # print(datetime.datetime.fromtimestamp(1231233213)) # print(datetime.datetime.now() + datetime.timedelta(days=3)) # print(datetime.datetime.now() + datetime.timedelta(days=-3)) # s=datetime.datetime.now() # print(s.replace(year=2020))
random
import random # print(random.random()) # print(random.randint(1,3)) # print(random.randrange(1,3)) # print(random.choice([1,'egon',[1,2]])) # print(random.sample([1, 'aa', [4, 5]], 2)) # print(random.uniform(1,3)) # item=['a','b','c','d'] # random.shuffle(item) # print(item)
生成随机验证码
利用random模块 函数 验证码位数由使用者传入 大写字母和数字组成 类似这种:输入9 输出:326VV61ZN
import random def make_code(n): res='' for i in range(n): s1=chr(random.randint(65,90)) s2=str(random.randint(0,9)) res+=random.choice([s1,s2]) return res print(make_code(9))
os
# import os # print(os.getcwd()) # print(os.listdir(r'D:s2视频目录day18')) # print(os.listdir('.')) # print(os.listdir('..')) # os.chdir(r'D:s2视频目录day08') # print(os.getcwd()) # print(os.listdir(r'D:s2视频目录day08')) # print(os.listdir(r'.')) # os.mkdir(r'a') # os.mkdir(r'a/b') # os.mkdir(r'a/b/c') # os.makedirs(r'acdef') # os.rmdir(r'acdef') # os.removedirs(r'acdef') # obj=os.stat(r'D:s2视频目录day18 un.py') # print(obj) # print(os.sep) # print(os.linesep) # print(os.pathsep) # import time,os # print(os.getpid()) # time.sleep(500) # res=os.system('taskliasdfst') # print('结果是:',res) # import json # # # 当程序所有的文件都需要引用一个变量时,则需要将该变量加入环境变量中 # os.environ['x']=json.dumps(['a','b','c']) # print(json.loads(os.environ['x'])[0]) # print(os.path.split(r'D:s2视频目录day18 3 random模块.py')) # print(os.path.dirname(r'D:s2视频目录day18 3 random模块.py')) # print(os.path.basename(r'D:s2视频目录day18 3 random模块.py')) # print(os.path.isabs(r'C:a.txt')) # print(os.path.isabs(r'a.txt')) # print(os.path.isabs('/a/b/c.txt')) # print(os.path.isabs('a/b/c.txt')) # print(os.path.join('C:\','a','D:\','b','F:\','c.txt')) print(os.path.getsize(r'D:s2视频目录day18 2 时间模块.py')) #字节
参考:http://www.cnblogs.com/linhaifeng/articles/6384466.html#_label3