模块和包

1. 包

  • 导入包的方式:

    • 第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
    • import project.v1.core.main
    • 第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
    • from project.v1.core import main
    • 第三种方式:绝对路径导入
      • 所有模块的导入从根目录开始
      • 根目录发生变化,包内的模块和代码也会发生变化
      • 在包内的代码调用时不会报错
      • 根目录节点的位置是由sys.path中的路径决定
      • 如果希望所有的程序都能正常运行,需要修改sys.path中的内容
    • 第四种方式:相对路径导入
      • 不用考虑当前目录的模块位置
      • 根节点发生变化,包内的模块位置不受影响
      • 在包内不能直接执行,不然会报错
      • 只能在包外调用,不用关心内部模块的导入问题
    • 第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
  • 包导入的常用模版:

  • import os
    import sys
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    print(sys.path)
    from core import main
    if __name__ == '__main__':
        main.starting()

2. hashlib模块

  • 说明:摘要算法模块

  • 分类:md5、sha1、sha256、sha512

  • 过程:不可逆

  • 应用:

    • 检测文件的一致性
    • 用户加密验证
  • 加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长

    • 单纯的加密方式不够安全
    • 加盐处理
    • 动态加盐
    • # md5加密方式
      import hashlib
      # 普通方式
      yy_md5 = hashlib.md5()
      yy_md5.update('liyanloveyaya'.encode('utf-8'))
      print(yy_md5.hexdigest())
      # 数据量大时,多次调用update(),最后计算的结果是一样的
      yan_md5 = hashlib.md5()
      yan_md5.update('liyan'.encode('utf-8'))
      yan_md5.update('love'.encode('utf-8'))
      yan_md5.update('yaya'.encode('utf-8'))
      print(yan_md5.hexdigest())
      # 加盐方式
      salt = 'salt'.encode('utf-8')
      yy1 = hashlib.md5()
      yy1.update(salt)
      yy1.update('yy1'.encode('utf-8'))
      print(yy1.hexdigest())
      yy2 = hashlib.md5()
      yy2.update(salt)
      yy2.update('yy2'.encode('utf-8'))
      print(yy2.hexdigest())
      # 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
      # 2. 可以使用动态加盐的方式进行加密
      >>>
      d0fd8c4c2c0d6af33bbed2425d275a5f
      d0fd8c4c2c0d6af33bbed2425d275a5f
      808c9cb52f0a9d6cc3ad8c5d8a57217e
      c90db841561b773553232b6ec7576e23d

3. configparse模块

  • 说明:配置文件模块

  • 作用:专门为解决一种样式的配置文件而产生的

  • # 初始化配置文件
    import configparser
    yy_config = configparser.ConfigParser()
    # 实例化配置文件
    yy_config['DEFAULT'] = {
    'default': 'config'
    }
    # DEFAULT组是默认组,可有可无
    yy_config['conf'] = {
    'ip': '10.0.0.1',
    'port': '3306',
    'username': 'yy',
    'password': '123456',
    'db_name': 'yy_db'
    }
    with open('config.ini', 'w', encoding='utf-8') as f:
    yy_config.write(f)
    >>>'config.ini文件内容' 
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    # 文件的查看操作(接上面代码)
    yy_config.read('config.ini')
    # 读取配置文件信息
    print(yy_config['conf']['ip'])
    # 查看组内一个键的值
    print(yy_config.get('conf', 'db_name'))
    # 查看组内一个键的值
    print(yy_config.options('conf'))
    # 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
    print(yy_config.items('conf'))
    # 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
    >>>
    10.0.0.1
    yy_db
    ['ip', 'port', 'username', 'password', 'db_name', 'default']
    [('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
    # 文件的增加操作(接上面代码)
    yy_config.add_section('redis_config')
    # 增加组
    yy_config['conf']['db_engine'] = 'InnoDB'
    yy_config['conf']['db_prefix'] = 'yy_'
    yy_config['redis_config']['ip'] = '10.0.0.2'
    yy_config['redis_config']['port'] = '6379'
    yy_config['redis_config']['auth'] = 'redis_password'
    # 增加组内的配置
    yy_config.write(open('config.ini', 'w'))
    # 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB
    db_prefix = yy_
    [redis_config]
    ip = 10.0.0.2
    port = 6379
    auth = redis_password
    # 文件的修改操作(接上面代码)
    yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
    # 修改组内键对应的值
    yy_config.write(open('config.ini', 'w'))
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB
    db_prefix = yy_
    [redis_config]
    ip = 10.0.0.2
    port = 6379
    auth = REDIS_Passw0rd
    # 文件的删除操作(接上面代码)
    yy_config.remove_section('redis_config')
    # 删除整个组
    yy_config.remove_option('conf', 'db_prefix')
    # 删除组内指定的键值对
    yy_config.write(open('config.ini', 'w'))
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB

4. logging模块

  • 说明:日志模块

  • 日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志

  • 日志级别(顺序是从上到下一级比一级严格):

    • logging.debug (调试模式)
    • logging.info (信息模式)
    • logging.warning (警告模式)
    • logging.error (错误模式)
    • logging.critical (批判模式)
  • 设置日志级别:

    • 默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
    • 设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
  • 简单模式:

    • 配置简单,直接可以使用
    • 无法同时输出多个地方
    • import logging
      logging.basicConfig(
      level=logging.INFO,
      # 日志级别
      format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
      # 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
      datefmt='%Y-%m-%d %H:%M:%S',
      # 日志的时间格式
      filename='logging.log',
      # 输出存储日志的文件名
      filemode='a',
      # 日志文件的打开模式
      )
      logging.debug('debug_message...')
      logging.info('info_message...')
      logging.warning('warning_message...')
      logging.error('error_message...')
      logging.critical('critical_message...')
      >>>'logging.log文件内容'
      [2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
  • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:

    • level:设置日志级别
    • format:设置日志显示格式
    • datefmt:设置日期时间格式
    • filename:指定日志输出的文件名,不指定输出到终端
    • filemode:指定日志文件的打开模式
    • stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
  • 日志显示格式的格式化串:
    • %(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用户输出的消息
  • 高级模式

    • 支持同时输出到多个地方
    • 可以配置多地存储方式
    • import logging
      yy_Logger = logging.getLogger()
      yy_Logger.setLevel(logging.INFO)
      # 设置日志级别
      # 实例化对象
      f1 = logging.FileHandler('logging1.log', encoding='utf-8')
      # 创建文件句柄
      format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
      # 指定日志输出格式
      f1.setFormatter(format1)
      # 关联文件句柄和日至格式
      yy_Logger.addHandler(f1)
      # 添加文件句柄到对象中
      f2 = logging.FileHandler('logging2.log', encoding='utf-8')
      format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      f2.setFormatter(format2)
      yy_Logger.addHandler(f2)
      s1 = logging.StreamHandler()
      # 创建屏幕流对象
      stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      s1.setFormatter(stream_format)
      yy_Logger.addHandler(s1)
      logging.debug('debug_message...')
      logging.info('info_message...')
      logging.warning('warning_message...')
      logging.error('error_message...')
      logging.critical('critical_message...')
      >>>'终端输出内容'
      2017-11-23 17:04:48,471 - root - INFO - info_message...
      2017-11-23 17:04:48,471 - root - WARNING - warning_message...
      2017-11-23 17:04:48,471 - root - ERROR - error_message...
      2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
      >>>'logging1.log文件内容'
      [2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
      >>>'logging2.log文件内容'
      2017-11-23 17:04:48,471 - root - INFO - info_message...
      2017-11-23 17:04:48,471 - root - WARNING - warning_message...
      2017-11-23 17:04:48,471 - root - ERROR - error_message...
      2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
  • 组件:

    • Logger:提供应用程序可直接使用的接口
    • Handler:指定日志输出的目的地
    • Filter:提供过滤日志信息的方法
    • Formatter:指定日志显示格式

1. 包

  • 导入包的方式:

    • 第一种方式(直接导入):import 包名.目录名.目录名n.模块名(中间所有的目录级别都使用.来连接,最后一个名字一定是模块名);使用时把import后面的所有当作一个整体来使用
      import project.v1.core.main
    • 第二种方式(直接导入):from 包名.目录名.目录名n import 模块名;使用时直接用模块名就可以
      from project.v1.core import main
    • 第三种方式:绝对路径导入
      • 所有模块的导入从根目录开始
      • 根目录发生变化,包内的模块和代码也会发生变化
      • 在包内的代码调用时不会报错
      • 根目录节点的位置是由sys.path中的路径决定
      • 如果希望所有的程序都能正常运行,需要修改sys.path中的内容
    • 第四种方式:相对路径导入
      • 不用考虑当前目录的模块位置
      • 根节点发生变化,包内的模块位置不受影响
      • 在包内不能直接执行,不然会报错
      • 只能在包外调用,不用关心内部模块的导入问题
    • 第五种方式:使用*和__all__结合,利用from ... import *和__all__的相关配置来产生一种包定制
  • 包导入的常用模版:

    import os
    import sys
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    print(sys.path)
    from core import main
    if __name__ == '__main__':
        main.starting()

2. hashlib模块

  • 说明:摘要算法模块

  • 分类:md5、sha1、sha256、sha512

  • 过程:不可逆

  • 应用:

    • 检测文件的一致性
    • 用户加密验证
  • 加密:最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示;SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示,比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长

    • 单纯的加密方式不够安全
    • 加盐处理
    • 动态加盐
      # md5加密方式
      import hashlib
      # 普通方式
      yy_md5 = hashlib.md5()
      yy_md5.update('liyanloveyaya'.encode('utf-8'))
      print(yy_md5.hexdigest())
      # 数据量大时,多次调用update(),最后计算的结果是一样的
      yan_md5 = hashlib.md5()
      yan_md5.update('liyan'.encode('utf-8'))
      yan_md5.update('love'.encode('utf-8'))
      yan_md5.update('yaya'.encode('utf-8'))
      print(yan_md5.hexdigest())
      # 加盐方式
      salt = 'salt'.encode('utf-8')
      yy1 = hashlib.md5()
      yy1.update(salt)
      yy1.update('yy1'.encode('utf-8'))
      print(yy1.hexdigest())
      yy2 = hashlib.md5()
      yy2.update(salt)
      yy2.update('yy2'.encode('utf-8'))
      print(yy2.hexdigest())
      # 1. 加盐可以使用复杂性的加密方式,最好用大小写字母、数字和特殊符号的组合使用
      # 2. 可以使用动态加盐的方式进行加密
      >>>
      d0fd8c4c2c0d6af33bbed2425d275a5f
      d0fd8c4c2c0d6af33bbed2425d275a5f
      808c9cb52f0a9d6cc3ad8c5d8a57217e
      c90db841561b773553232b6ec7576e23d
      # sha1加密方式
      import hashlib
      yy_sha1 = hashlib.sha1()
      yy_sha1.update('liyanloveyaya'.encode('utf-8'))
      print(yy_sha1.hexdigest())
      yan_sha1 = hashlib.sha1()
      yan_sha1.update('liyan'.encode('utf-8'))
      yan_sha1.update('love'.encode('utf-8'))
      yan_sha1.update('yaya'.encode('utf-8'))
      print(yan_sha1.hexdigest())
      salt = 'salt'.encode('utf-8')
      yy1 = hashlib.sha1()
      yy1.update(salt)
      yy1.update('yy1'.encode('utf-8'))
      print(yy1.hexdigest())
      yy2 = hashlib.sha1()
      yy2.update(salt)
      yy2.update('yy2'.encode('utf-8'))
      print(yy2.hexdigest())
      >>>
      cb15dcc3b29d8a38779f1968aa294790ae13729c
      cb15dcc3b29d8a38779f1968aa294790ae13729c
      063737cfa77f3e8fe7d530646302a09738f64db4
      55238a894d69ad3ae13a4dc0bb671ab7bc51df58

3. configparse模块

  • 说明:配置文件模块

  • 作用:专门为解决一种样式的配置文件而产生的

    # 初始化配置文件
    import configparser
    yy_config = configparser.ConfigParser()
    # 实例化配置文件
    yy_config['DEFAULT'] = {
    'default': 'config'
    }
    # DEFAULT组是默认组,可有可无
    yy_config['conf'] = {
    'ip': '10.0.0.1',
    'port': '3306',
    'username': 'yy',
    'password': '123456',
    'db_name': 'yy_db'
    }
    with open('config.ini', 'w', encoding='utf-8') as f:
    yy_config.write(f)
    >>>'config.ini文件内容' 
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    # 文件的查看操作(接上面代码)
    yy_config.read('config.ini')
    # 读取配置文件信息
    print(yy_config['conf']['ip'])
    # 查看组内一个键的值
    print(yy_config.get('conf', 'db_name'))
    # 查看组内一个键的值
    print(yy_config.options('conf'))
    # 查看组中所有的键,以列表的形式返回,也包括了默认组中的键
    print(yy_config.items('conf'))
    # 查看组中所有的键值对,键值对使用元组存储,每一对分别放在列表中返回,也包括了默认组中的键值对
    >>>
    10.0.0.1
    yy_db
    ['ip', 'port', 'username', 'password', 'db_name', 'default']
    [('default', 'config'), ('ip', '10.0.0.1'), ('port', '3306'), ('username', 'yy'), ('password', '123456'), ('db_name', 'yy_db')]
    # 文件的增加操作(接上面代码)
    yy_config.add_section('redis_config')
    # 增加组
    yy_config['conf']['db_engine'] = 'InnoDB'
    yy_config['conf']['db_prefix'] = 'yy_'
    yy_config['redis_config']['ip'] = '10.0.0.2'
    yy_config['redis_config']['port'] = '6379'
    yy_config['redis_config']['auth'] = 'redis_password'
    # 增加组内的配置
    yy_config.write(open('config.ini', 'w'))
    # 文件操作增加完默认保存在内存中,需要使用写文件的操作保存操作结果
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB
    db_prefix = yy_
    [redis_config]
    ip = 10.0.0.2
    port = 6379
    auth = redis_password
    # 文件的修改操作(接上面代码)
    yy_config.set('redis_config', 'auth', 'REDIS_Passw0rd')
    # 修改组内键对应的值
    yy_config.write(open('config.ini', 'w'))
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB
    db_prefix = yy_
    [redis_config]
    ip = 10.0.0.2
    port = 6379
    auth = REDIS_Passw0rd
    # 文件的删除操作(接上面代码)
    yy_config.remove_section('redis_config')
    # 删除整个组
    yy_config.remove_option('conf', 'db_prefix')
    # 删除组内指定的键值对
    yy_config.write(open('config.ini', 'w'))
    >>>'config.ini文件内容'
    [DEFAULT]
    default = config
    [conf]
    ip = 10.0.0.1
    port = 3306
    username = yy
    password = 123456
    db_name = yy_db
    db_engine = InnoDB

4. logging模块

  • 说明:日志模块

  • 日志的描述:把程序运行的过程输出到屏幕或文件中记录,叫日志

  • 日志级别(顺序是从上到下一级比一级严格):

    • logging.debug (调试模式)
    • logging.info (信息模式)
    • logging.warning (警告模式)
    • logging.error (错误模式)
    • logging.critical (批判模式)
  • 设置日志级别:

    • 默认设置全局输出的日志级别为debug模式:logger.setLevel(logging.Debug)
    • 设置单个文件流或屏幕流的日志级别位debug模式:句柄名称.setLevel(logging.Debug)
  • 简单模式:

    • 配置简单,直接可以使用
    • 无法同时输出多个地方
      import logging
      logging.basicConfig(
      level=logging.INFO,
      # 日志级别
      format='[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]',
      # 日志输出格式(时间格式化、程序文件名、程序在文件中的行数、日至级别、日志描述信息)
      datefmt='%Y-%m-%d %H:%M:%S',
      # 日志的时间格式
      filename='logging.log',
      # 输出存储日志的文件名
      filemode='a',
      # 日志文件的打开模式
      )
      logging.debug('debug_message...')
      logging.info('info_message...')
      logging.warning('warning_message...')
      logging.error('error_message...')
      logging.critical('critical_message...')
      >>>'logging.log文件内容'
      [2017-11-23 16:42:55] [yan27.py] [line:57] [INFO] [info_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:58] [WARNING] [warning_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:59] [ERROR] [error_message...]
      [2017-11-23 16:42:55] [yan27.py] [line:60] [CRITICAL] [critical_message...]
  • logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,常用的参数有:

    • level:设置日志级别
    • format:设置日志显示格式
    • datefmt:设置日期时间格式
    • filename:指定日志输出的文件名,不指定输出到终端
    • filemode:指定日志文件的打开模式
    • stream:指定输出终端(默认的输出方式),如果指定了filename,则stream不生效
  • 日志显示格式的格式化串:
    • %(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用户输出的消息
  • 高级模式

    • 支持同时输出到多个地方
    • 可以配置多地存储方式
      import logging
      yy_Logger = logging.getLogger()
      yy_Logger.setLevel(logging.INFO)
      # 设置日志级别
      # 实例化对象
      f1 = logging.FileHandler('logging1.log', encoding='utf-8')
      # 创建文件句柄
      format1 = logging.Formatter('[%(asctime)s] [%(filename)s] [line:%(lineno)d] [%(levelname)s] [%(message)s]')
      # 指定日志输出格式
      f1.setFormatter(format1)
      # 关联文件句柄和日至格式
      yy_Logger.addHandler(f1)
      # 添加文件句柄到对象中
      f2 = logging.FileHandler('logging2.log', encoding='utf-8')
      format2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      f2.setFormatter(format2)
      yy_Logger.addHandler(f2)
      s1 = logging.StreamHandler()
      # 创建屏幕流对象
      stream_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      s1.setFormatter(stream_format)
      yy_Logger.addHandler(s1)
      logging.debug('debug_message...')
      logging.info('info_message...')
      logging.warning('warning_message...')
      logging.error('error_message...')
      logging.critical('critical_message...')
      >>>'终端输出内容'
      2017-11-23 17:04:48,471 - root - INFO - info_message...
      2017-11-23 17:04:48,471 - root - WARNING - warning_message...
      2017-11-23 17:04:48,471 - root - ERROR - error_message...
      2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
      >>>'logging1.log文件内容'
      [2017-11-23 17:04:48,471] [yan27.py] [line:90] [INFO] [info_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:91] [WARNING] [warning_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:92] [ERROR] [error_message...]
      [2017-11-23 17:04:48,471] [yan27.py] [line:93] [CRITICAL] [critical_message...]
      >>>'logging2.log文件内容'
      2017-11-23 17:04:48,471 - root - INFO - info_message...
      2017-11-23 17:04:48,471 - root - WARNING - warning_message...
      2017-11-23 17:04:48,471 - root - ERROR - error_message...
      2017-11-23 17:04:48,471 - root - CRITICAL - critical_message...
  • 组件:

    • Logger:提供应用程序可直接使用的接口
    • Handler:指定日志输出的目的地
    • Filter:提供过滤日志信息的方法
    • Formatter:指定日志显示格式

posted on 2017-11-23 18:52  卖火柴的嫩火柴  阅读(174)  评论(0编辑  收藏  举报

导航