• python之常用模块


    1.logging模块

    1.1logging模块的级别

    debug 调试
    info 记录
    warning 潜在危险
    error 报错
    critical 严重的

    1.2在文件中输出日志

    import logging
    logging.basicConfig(filename='log.test.log',
                        level=logging.INFO,#只有比设定的等级高或者和设定的等级一样才会显示⭐️⭐️
                        format='%(asctime)s%(message)s',
                        datefmt='%yY-%m-%d%I:%M:%s%P')
    
    logging.info('My name is Gao hui')
    logging.debug('My name is hong yan')
    logging.warning('My name is Alex Li')

    自定义日志格式的选项:

    %(name)s     Logger的名字
    %(levelno)s   数字形式的日志级别
    %(levelname)s 文本形式的日志级别
    %(pathname)s 调用日志输出的函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出的函数的模块的文件名
    %(module)s 调用日志输出的函数的模块名
    %(funcName)s 调用日志输出的函数的函数名
    %(lineno)d 调用日志输出的函数的语句所在行的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮点数来表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数
    %(asctime)s 字符串形式的当前时间,默认格式是“2003-07-08  16:49:45,896”。逗号后面的是毫秒
    %(thread)d 线程id。可能没有
    %(threadName)s 线程名。可能没有
    %(process)d 进程id。可能没有
    %(message)s   用户输出的消息

    1.3在文件和屏幕中同时输出日志

    import logging
    
    #1.生成logger对象
    logger = logging.getLogger("gao")#创建日志对象
    logger.setLevel(logging.INFO) #设置全局等级
    
    #2.生成hanlder
    console = logging.StreamHandler()#日志以屏幕形式输出
    console.setLevel(logging.WARNING)#设置屏幕等级
    
    #text = logging.FileHandler("gao.log")#日志以文件格式输出
    text.setLevel(logging.WARNING)#设置文件等级
    
    #2.1把handle对象绑定到logger
    logger.addHandler(console)
    logger.addHandler(text)
    
    
    #3.生成formatter对象
    console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    console.setFormatter(console_formatter)
    text.setFormatter(file_formatter)
    
    
    logger.warning("test1")
    logger.info("test2")

    1.4用filter过滤

    import logging
    from logging import handlers
    class IgnoreBackupLogFilter(logging.Filter):
        '''忽略带db backup的日志'''
        def filter(self, record):#固定写法
            return "db backup" in record.getMessage()#如果日志里有db backup,那就过滤,没有就显示日志
    
    
    #1.生成logger对象
    logger = logging.getLogger("gao")#创建日志对象
    logger.setLevel(logging.INFO) #设置全局等级
    
    
    #2.生成hanlder
    console = logging.StreamHandler()#日志以屏幕形式输出
    console.setLevel(logging.WARNING)#设置屏幕等级
    
    #text = logging.FileHandler("gao.log")#日志以文件格式输出
    text.setLevel(logging.WARNING)#设置文件等级
    
    #2.1把handle对象绑定到logger
    logger.addHandler(console)
    logger.addHandler(text)
    
    
    #3.生成formatter对象
    console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    console.setFormatter(console_formatter)
    text.setFormatter(file_formatter)
    
    
    logger.warning("test1")
    logger.info("test2")
    logging.warning("####")#如果xxxx里有db backup,那就过滤,没有就显示日志

    1.5 RotatingFileHandler

    当文件到达一定大小后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。当chat.log 达到指定的大小之后,RotatingFileHandler自动把文件改名为 chat.log.1。不过,如果chat.log1 重命名为 chat.log2, 最后重新创建 chat.log 继续输出日志情况。它的函数是:

    RotatingFileHandler (filename [, mode[,  maxBytes [,  backupCount]]])

    maxBytes用于制定日志文件的最大文件大小。如果maxbytes 为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。

    backCount 用于指定保留的备份文件的个数。比如:如果指定为2,但上面描述的重命名过程发生时,原有的 chat.log.2 并不会被更名,而是被删除。

    import logging
    from logging import handlers
    
    #1.生成logger对象
    logger = logging.getLogger("gao")#创建日志对象
    logger.setLevel(logging.INFO) #设置全局等级
    
    
    #2.生成hanlder
    console = logging.StreamHandler()#日志以屏幕形式输出
    console.setLevel(logging.WARNING)#设置屏幕等级
    
    text = handlers.RotatingFileHandler("gao.log",maxBytes=3,backupCount=6)#字节,log次数
    text.setLevel(logging.WARNING)#设置文件等级
    
    #2.1把handle对象绑定到logger
    logger.addHandler(console)
    logger.addHandler(text)
    
    
    #3.生成formatter对象
    console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    console.setFormatter(console_formatter)
    text.setFormatter(file_formatter)
    
    
    logger.warning("test1")
    logger.info("test2")

      

    1.6 TimeRotatingFileHandler

    通过时间间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的函数是:

    RotatingFileHandler (filename[, when [,  interval [,  backupCount]]

    其中filename 参数和backupCount 参数和 RotatingFileHandler 具有相同的意义。

    interval 是时间间隔

    when 参数是一个字符串。表示时间间隔的单位,不区分大小写,它有以下取值:

    S  秒

    M  分

    H  小时

    D  天

    W  每星期(interval = 0 时代表星期一)

    midnight 每天凌晨

    import logging
    from logging import handlers
    
    #1.生成logger对象
    logger = logging.getLogger("gao")#创建日志对象
    logger.setLevel(logging.INFO) #设置全局等级
    
    
    #2.生成hanlder
    console = logging.StreamHandler()#日志以屏幕形式输出
    console.setLevel(logging.WARNING)#设置屏幕等级
    
    text = handlers.TimedRotatingFileHandler("gao.log", when="10", interval=5, backupCount=6)
    text.setLevel(logging.WARNING)#设置文件等级
    
    #2.1把handle对象绑定到logger
    logger.addHandler(console)
    logger.addHandler(text)
    
    
    #3.生成formatter对象
    console_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    file_formatter = logging.Formatter('%(name)s - %(asctime)s - %(module)s - %(levelname)s - %(message)s')
    
    console.setFormatter(console_formatter)
    text.setFormatter(file_formatter)
    
    
    logger.warning("test1")
    logger.info("test2")

    2.序列化

    2.1 json

    只转成字符串

    import json
    
    fruits = {'fruit': 'apple', 'fruit1': 'watermelon'}
    
    d = json.dumps(fruits)#将字典转为字符串
    print(d, type(d))
    
    a = json.loads(d)#将字符串在转为先前的字符类型
    print(a, type(a))

    意义:

    1.把内存数据通过网络远程共享给其他人

    2.可以跨平台,跨语言

    存到文件中

    import json
    
    f = open("test.json", "w")
    d = json.dump(fruits, f) #将字典改为字符串并传入文件
    
    f = open("test.json", "r")#读取文件内容再将内容转为原先的格式
    d = json.load(f)
    print(d, type(d))
    
    
    #可以dump多次,不能load多次

    2.2 pickle

    只转成pickle类型

    import  pickle
    
    fruits = {'fruit': 'apple', 'fruit1': 'watermelon'}
    
    d = pickle.dumps(fruits)#将字典转为bytes类型
    print(d, type(d))
    
    a = pickle.loads(d)#将字符串在转为先前的字符类型
    print(a, type(a))

    传入文件中

    import pickle
    
    f = open("test.pkl", "wb")
    d = pickle.dump(fruits, f) #将字典改为pickle类型并传入文件
    
    f = open("test.json", "rb")#读取文件内容再将内容转为原先的格式
    d = pickle.load(f)
    print(d, type(d))

    json 与 pickle 的优缺点

    json:

    优点:跨语言,体积小

    缺点:只支持 intstr uplelistdict

    pickle:

    优点:专为python设计,适合python所有的数据类型

    缺点:只能在python中使用,储存数据占空间大

    2.3 shelve

    先在pycharm创一个文件

    import shelve
    
    f = shelve.open('xin.sev')
    
    names = ['1', '2', '3']
    info = {'name': 'gao hui', 'age': '21'}
    
    f['info_gao'] = info #持久化列表
    f['name'] = names

    然后在终端里面找到文件

    kouhuideMacBook-Air:module kouhui$ python3
    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) 
    [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import shelve
    >>> f = shelve.open(xin.sev)
    >>> f = shelve.open('xin.sev')
    >>> f
    <shelve.DbfilenameShelf object at 0x1053d6208>
    >>> a = list(f)
    >>> print(a)
    ['info_gao', 'name']
    >>> list(f.items())
    [('info_gao', {'name': 'gao hui', 'age': '21'}), ('name', ['1', '2', '3'])]
    >>> f.get('info_gao')
    {'name': 'gao hui', 'age': '21'}
    >>> f.get('name')
    ['1', '2', '3']

    3.random

    randint 可取到边界值

    >>> import random
    >>> random.randint(0,3)
    3
    >>> 
    >>> random.randint(0,3)
    2
    >>> random.randint(0,3)
    2
    >>> random.randint(0,3)
    3
    >>> random.randint(0,3)
    0

    randrange 取不到最大的边界值

    >>> random.randrange(0,3)
    2
    >>> random.randrange(0,3)
    1
    >>> random.randrange(0,3)
    2
    >>> random.randrange(0,3)
    1
    >>> random.randrange(0,3)
    0
    >>> 

    random.sample 在范围内取个数

    >>> random.sample('wdasdqdq231',3)
    ['3', '2', 'a']
    >>> random.sample('wdasdqdq231',3)
    ['w', 'q', '1']
    >>> random.sample('wdasdqdq231',3)
    ['w', 'd', 's']
    >>> random.sample('wdasdqdq231',3)
    ['1', 'd', 'q']
    >>> random.sample('wdasdqdq231',3)
    ['s', '2', 'd']
    >>> random.sample('wdasdqdq231',3)
    ['q', 'w', 'd']
    >>> random.sample('wdasdqdq231',3)
    ['d', 'd', 's']
    >>> 

    4.configparser

    放在ini文件中的内容
    
    [leogao]
    name = leogao
    password = 123456
    expire = 2017-08-06
    
    
    [yanhong]
    name = yanhong
    password = 12345
    expire = 2017-09-06
    import configparser
    
    config=configparser.ConfigParser()
    config.read('文件名')
    
    print(config.sections)
    输出为 ['leogao', 'yanhong']
    
    
    查看laogao下的所有的key
    print(config.options('leogao'))
    输出为 ['name', 'password', 'expire']
    
    
    查看leogao下的name的值
    val=config.get('leogao','name')
  • 相关阅读:
    2015/8/28 回校正常学习工作
    Asp.net自定义控件开发任我行(3)-Render
    Asp.net自定义控件开发任我行(2)-TagPrefix标签
    Asp.net自定义控件开发任我行(1)-笑傲江湖
    ET采集阿里妈妈淘宝客商品规则
    淘宝API还能用来采集数据吗?taobao.item.get 接口还能用吗?
    淘宝api升级,无法采集淘宝的数据,taobao.item.get 和taobao.taobaoke.items.get都不能用
    用firefox浏览器访问localhost,apache http server 已停止工作
    淘宝客网站怎么批量采集淘宝商品,方维采集淘宝数据思路
    方维购物分享系统怎么样,方维系统安全性检测
  • 原文地址:https://www.cnblogs.com/huizaia/p/9164441.html
Copyright © 2020-2023  润新知