一.模块
1.什么是模块
最常见的场景,一个模块就是包含了一组功能的Python文件,例如:moudule.py,模块名是moudle,可以使用import module

四个通用类别:
1.使用python编写的py文件
2.已经编译为共享库或DLL的C或C++扩展
3.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件称为包)
4.使用C编写并链接到Python解释器的内置模块

2.为什么用模块
   1.从文件级别组织程序,更方便管理
   2.拿来主义,提升开发效率

3.如何使用模块-->import:模块名
    1.第一次导入模块会:(重复导入只会引用之前加载好的结果)
                    1.产生一个新的名称空间
            2.运行__.py代码,产生的名字都存放于1的名称空间中,运行过程中global关键字指向的就是该名称空间。
            3.在当前名称空间拿到一个名字__,该名称空间指向1的名称空间,引用__.py中名字的方式:__.名字
注:被导入的模块在执行过程中使用自己独立的名称空间作为全局名称空间

   2.起别名:import time as luo

   3.一行导入多个模块以逗号分隔:import time,sys,os 
例:
模块文件
#spam.py
print('from the spam.py')
money=100
def read1():
    print('spam模块:',money)
def change():
    global money
    money=0

调用文件
import spam
print(spam.read1)

4.如何使用模块-->from 模块名 import 名字
    1.优点:引用时不用加前缀,简单
      缺点:容易与当前名称空间的名字冲突
调用文件
from spam import read1,change
print(read1)

     2.起别名:from spam import change as n

     3.一行导入多个模块以逗号分隔:from spam import read1,change

     4.*导入所有模块的名称:from spam import * (*包含了除了以"_"开头的模块名不能被导入,其它的都可以导入)
      如:_money=100
     *的原理:__all__=['read1,change'],只调用的列表里面的模块名。

5.一个Python文件的两种用途
    1.当做脚本执行:__name__ == '__main__'
    2.当做模块被导入使用:__name__ == '模块名'
    if __name__ == '__main__':
        pass

6.模块的搜索路径
   内存——》内置模块--》sys.path
   把模块添加至环境变量,例:sys.path.append(r'/home/aaa/')

improt sys
print(sys.modules) #查看内存以加载的模块

二、包
  1.包的定义:包就是包含了__init__.py文件的文件夹,可以往该文件夹下放下一堆子模块。

  2.包的使用(包的路劲以当前执行文件为准)
     注:但凡是在导入时,出现“.”,这是导入包才有的语法,“.”的左边必须是一个包,使用的时候没有这种限制。
    import packe  #packe为包的文价夹名,packe--->默认引用__init__.py

文件__init__.py
from packe import mar #调用mar模块
print(packe.mar.foo())

文件mar.py
def foo():
  print('from in mar')

三、 
import sys,os
base_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #abspath绝对路劲,dirname上级文件夹路劲
sys.path.append(base_dir)

os.path.jojn(r'C:\\','a','b','c.txt') #jojn路径拼接

四、常用模块
日志模块:
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  #指定日志级别
)
logging.debug('debug') #10
logging.info('info')   #20
logging.warning('warn')#30
logging.error('error') #40
logging.critical('critial') #50

日志模块的详细用法:
1.Logger:产生日志

2.Filter:

3.Handler:接收Logger传过来的日志,进行日志格式化,可以打印到终端,也可以打印到文件,可以指定多个Handler

4.Formatter:日式格式化

5.为Handler绑定日志格式

6.为logger绑定Handler

7.测试

import logging
logger1=logging.getLogger('访问日志')

sh=logging.StrcamHandler()   #打印大终端
fh1=logging.FileHandler('s1.log',encoding='utf-8')
fh2=logging.FileHandler('s2.log',encoding='utf-8')

fromatter1=logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)

fromatter2=logging.Formatter(
fmt='%(asctime)s : %(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)

fromatter3=logging.Formatter(
fmt='%(asctime)s : %(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)

为Handler绑定日志格式
sh.setFormatter(fromatter1)
fh1.setFormatter(fromatter2)
fh2.setFormatter(fromatter3)

为logger绑定Handler
logging.addHandler(sh)
logging.addHandler(fh1)
logging.addHandler(fh2)

设置日志级别:logger对象的日志级别应该小于等于handler的日志级别
logger1.setleve(30)
sh.setleve(10)
fh1.setleve(10)
fh2.setleve(10)

测试
logger1.debug('ceshi')
logger1.info('info')
logger1.warning('warning')
logger1.error('errot')
logger1.critical('critial')

日志的继承关系:
import logging
logger1=logging.getLogger('root')
logger2=logging.getLogger('root.child')
logger3=logging.getLogger('root.child.child2')