復習


上節課復習1、什么是模塊模塊是一系列功能的集合體2、為何用模塊拿來(內置或第三方的模塊)主義,提升開發效率自定義模塊可以讓程序的各部分組件重用模塊內的功能3、如何用模塊大前提:模塊是被執行文件導入使用,模塊的導入必須搞明白誰是執行文件,誰是被導入的模塊import首次import m1導入模塊都發生三件事:1、先創建一個模塊的名稱空間2、執行m1.py,將執行過程中產生的名稱都放入模塊的名稱空間中3、在當前執行文件中拿到一個名字m1,該名字是指向模塊的名稱空間使用方法:指名道姓地訪問m1名稱空間中的名字func,優點是不會與當前名稱空間中的名字沖突,缺點是每次訪問都需要加上前綴m1.funcfrom ... import首次from m1 import func導入模塊都發生三件事:1、先創建一個模塊的名稱空間2、執行m1.py,將執行過程中產生的名稱都放入模塊的名稱空間中3、在當前執行文件中直接拿到一個功能名func,該名字是直接指向模塊名稱空間中的某一個功能的使用方法:直接使用功能即可,優點是無需加任何前綴,缺點是容易與當前名稱空間中的名字沖突def func():passfunc()4、模塊的搜索路徑內存-》內置模塊-》sys.path5、軟件開發的目錄規范今日內容1、模塊的另外一種形式->包(****)2、常用模塊logging日志模塊時間模塊random模塊json與pickle模塊
?
包


1、什么是包包是模塊的一種形式,包的本質就是一個含有__init__.py文件的文件夾2、為什么要有包3、如何用包導入包就是在導包下的__init__.pyimport ...from ... import...注意的問題:1、包內所有的文件都是被導入使用的,而不是被直接運行的2、包內部模塊之間的導入可以使用絕對導入(以包的根目錄為基準)與相對導入(以當前被導入的模塊所在的目錄為基準)推薦使用相對導入3、當文件是執行文件時,無法在該文件內用相對導入的語法只有在文件時被當作模塊導入時,該文件內才能使用相對導入的語法4、凡是在導入時帶點的,點的左邊都必須是一個包import aaa.bbb.m3.f3 # 錯誤
?
日志模塊


# import logging # 進行基本的日志配置 # logging.basicConfig(filename='access.log', # format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # datefmt='%Y-%m-%d %H:%M:%S %p', # level=10, # # stream=True # )# 日志級別遵循原則:自下而上進行匹配 #debug-》info-》warning-》error-》critical # logging.debug('調試信息') #10 # logging.info('正常信息') #20 # logging.warning('不好啦著火啦') #30 # logging.error('報錯信息') #40 # logging.critical('嚴重錯誤信息') #50# 問題: #1、沒有指定日志級別 #2、沒有指定日志格式 #3、只能往屏幕打印,沒有寫入文件# 新問題 #1、不能指定字符串編碼 #2、只能往文件中打印import logging # logging模塊包含四種角色:logger,filter,formatter,handler #1、logger:負責產生日志信息 logger1=logging.getLogger('交易日志') # logger2=logging.getLogger('用戶相關')#2、filter:負責篩選日志#3、formatter:控制日志輸出格式 formatter1=logging.Formatter(fmt='%(asctime)s:%(name)s:%(levelname)s:%(message)s',datefmt='%Y-%m-%d %X' ) formatter2=logging.Formatter(fmt='%(asctime)s:%(message)s',datefmt='%Y-%m-%d %X' )#4、handler:負責日志輸出的目標 h1=logging.FileHandler(filename='a1.log',encoding='utf-8') h2=logging.FileHandler(filename='a2.log',encoding='utf-8') sm=logging.StreamHandler()#5、綁定logger對象與handler對象 logger1.addHandler(h1) logger1.addHandler(h2) logger1.addHandler(sm)#6、綁定handler對象與formatter對象 h1.setFormatter(formatter1) h2.setFormatter(formatter1) sm.setFormatter(formatter2)#7、設置日志級別:可以在兩個關卡進行設置logger與handler logger1.setLevel(10) h1.setLevel(10) h2.setLevel(10) sm.setLevel(10)logger1.info('Egon借給李杰100W')


""" logging配置 """ import os import logging.config# 定義三種日志輸出格式 開始 standard_format = '%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s'simple_format = '%(asctime)s - %(levelname)s - %(message)s'id_simple_format = '[%(asctime)s] %(message)s'# log文件的全路徑 logfile1_path = r'D:\SH_fullstack_s2\day17\a1.log' logfile2_path = r'D:\SH_fullstack_s2\day17\a2.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亂碼了 },},'loggers': {#logging.getLogger(__name__)拿到的logger配置'logger1': {'handlers': ['h1','h2','sm'],'level': 'DEBUG','propagate': False, # 向上(更高level的logger)傳遞 },}, }
?