• python-study-18


    复习

    上节课复习:
        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模块
    View Code

    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)传递
            },
        },
    }
    settings
    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)
    run.py

    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
    json序列化
    # 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反序列化
    # 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
    json注意点
    # 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数据类型
    pickle序列化
    # 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
    pickle反序列化

    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))
    View Code

    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)
    View Code

    生成随机验证码 

    利用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))
    View Code

    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视频目录day183 random模块.py'))
    # print(os.path.dirname(r'D:s2视频目录day183 random模块.py'))
    # print(os.path.basename(r'D:s2视频目录day183 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视频目录day182 时间模块.py')) #字节
    View Code

    参考:http://www.cnblogs.com/linhaifeng/articles/6384466.html#_label3

  • 相关阅读:
    vue打包---放到服务器下(一个服务器多个项目需要配置路径),以及哈希模式和历史模式的不同配置方法
    承诺----异步函数---封装一个函数,使用承诺得到返回值(原本三个参数,使用前两个参数发送请求,得到第三个参数想要的结果,但是在函数外部拿不到第三个参数的值,所以改为两个参数,用承诺来获取第三个参数)
    双层拖拽事件,用鼠标画矩形,拖动右下角可以再次改变矩形大小,方案一 有BUG
    axios 使用方法 以及服务器端 设置拦截发送404状态的提示语,当网络错误时候返回前端的提示, 当网络正常的时候返回后端的提示
    异步async await 相关知识点总结以及代码练习
    vue+div.canvas图像标注功能实现
    Django与Ajax
    项目园
    Django 路由层与视图层
    Bootstrap框架如何设置导入链接
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9204905.html
Copyright © 2020-2023  润新知