模块
一、定义
模块:用来从逻辑上组织python代码(变量,函数,类,逻辑----实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块就是test)
包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件)
二、导入方法
module_cc文件里有很多函数&变量:
import module1_name
import module1_name,module2_name
from module_cc import * #把其他模块的东西全部导入过来执行一遍
from module_cc import m1,m2,m3
from module_alex import logger as logger_alex#若导入的模块名与当前的函数名相同,则可用as对导入的模块名重命名
三、 import本质
导入模块的本质就是把python文件解释一遍;
导入包的本质就是执行该包下的__init__.py文件;
四、模块分类
python的模块又分为以下三种:
- 自定义模块
- 内置标准模块(标准库)
- 开源模块
五、自定义模块
、、、、、、
六、内置常用模块
1、time模块
时间的三种方式:
时间戳(timestamp) :数字(计算机能认识的)
时间字符串(form string):t='2012-12-12'
结构化时间(time_struct):time.struct_time(tm_year=2017, tm_mon=8, tm_mday=8, tm_hour=8, tm_min=4, tm_sec=32, tm_wday=1, tm_yday=220, tm_isdst=0)像这样的就是结构化时间
- time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来、
- time.time()当前时间的时间戳、
- time.localtime()当前的结构化时间对象、
- time.gmtime()国际时间
***** python中时间日期格式化符号****** 1 %y 两位数的年份表示(00-99) 2 %Y 四位数的年份表示(000-9999) 3 %m 月份(01-12) 4 %d 月内中的一天(0-31) 5 %H 24小时制小时数(0-23) 6 %I 12小时制小时数(01-12) 7 %M 分钟数(00=59) 8 %S 秒(00-59) 9 %a 本地简化星期名称 10 %A 本地完整星期名称 11 %b 本地简化的月份名称 12 %B 本地完整的月份名称 13 %c 本地相应的日期表示和时间表示 14 %j 年内的一天(001-366) 15 %p 本地A.M.或P.M.的等价符 16 %U 一年中的星期数(00-53)星期天为星期的开始 17 %w 星期(0-6),星期天为星期的开始 18 %W 一年中的星期数(00-53)星期一为星期的开始 19 %x 本地相应的日期表示 20 %X 本地相应的时间表示 21 %Z 当前时区的名称 22 %% %号本身
import time # time_demo1 = time.clock() # time_demo2 = time.process_time() # time_dmeo3 = time.time() # time_demo4 = time.localtime() # time_demo5 = time.gmtime() # print(time_demo1) #0.112510988 # print(time_demo2) #0.203125测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来 # print(time_dmeo3) #1557717882.739453当前时间的时间戳 # print(time_demo4) #当前的结构化时间对象(utc时间)(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=11, tm_min=26, tm_sec=37, tm_wday=0, tm_yday=1) # print(time_demo5) #国际时间(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=3, tm_min=31, tm_sec=37, tm_wday=0, tm_yday=133, tm_isdst=0) ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————- # print(time.ctime()) #当前系统时间 Mon May 13 11:35:19 2019 # print(time.gmtime(time.time())) #转换成time.struct_time格式(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=3, tm_min=38, tm_sec=53, tm_wday=0, tm_yday=133, tm_isdst=0) # print(time.mktime(time.localtime())) #与上面的相反,将struct_time格式转回成时间戳格式。1557718878.0 # 时间延迟 time.sleep() # time.sleep(10) #延迟10秒 —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— # 将struct_time格式转成指定的字符串格式 # print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))) #2019-05-13 11:48:17 # 将字符串格式转成struct_time格式 # print(time.strptime("2016-9-9","%Y-%m-%d")) #time.struct_time(tm_year=2016, tm_mon=9, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=253,
2、datetime模块
import datetime # print(datetime.date.fromtimestamp(time.time() - 100000)) #2019-05-12为减去的时间1000000 # print(datetime.date.today()) #2019-05-13 # print(datetime.date.fromtimestamp(time.time() - 100000)) #2019-05-12 # time_demo = datetime.datetime.now() # print(time_demo) #2019-05-13 13:28:10.131284 # 返回struct_time格式的时间 # print(time_demo.timetuple()) #time.struct_time(tm_year=2019, tm_mon=5, tm_mday=13, tm_hour=13, tm_min=30, tm_sec=2, tm_wday=0, tm_yday=133, tm_isdst=-1) #指定替换 #print(time_demo.replace(2018,8,8)) #2018-08-08 13:32:29.776685 # 字符串转换为日期格式 # time_demo2 = datetime.datetime.strptime("2019-9-9","%Y-%m-%d") # print(time_demo2) #2019-09-09 00:00:00 # 时间的计算 # 加10天 # time_demo3 = datetime.datetime.now() + datetime.timedelta(days = 10) # print(time_demo3) # 2019-05-23 13:44:06.759625 # 减10小时 # time_demo3 = datetime.datetime.now() + datetime.timedelta(hours = 10) # # print(time_demo3) #2019-05-13 23:47:07.829724 # 减200s # time_demo3 = datetime.datetime.now() - datetime.timedelta(seconds = 200) # print(time_demo3) #2019-05-13 13:45:21.479477
3、random
import random # 1.随机小数 # print(random.random()) #随机0-1的小数 # print(random.uniform(1,9)) # 随机1-9的小数 # 2.随机整数 # print(random.randint(1,6)) #随机1-6的整数 # print(random.randrange(1,9,2)) #随机1-9之间的奇数 # 3.随机选择一个返回值 里面是一个列表 # print(random.choice([1,23,45435,"hello",[1,33,43,32]])) # 4.随机选择一组数据组合 # print(random.sample([2,2213,43,"","diss",[1,2,3]],3)) # 5.打乱列表顺序 # list_demo = [1,2,3,44,56,76,43,35] # random.shuffle(list_demo) #打乱顺序 # print(list_demo)
验证码例子
1 # 验证码小例子(这个只是产生随机的四位数字) 2 # 方法一、 3 # l=[] 4 # for i in range(4): 5 # l.append(str(random.randint(0,9))) 6 # print(''.join(l)) 7 # print(l) 8 9 10 # 方法二 11 # print(random.randint(1000,9999)) 12 13 14 # 验证码升级版 15 # 要求:首次要有数字,其次要有字母,一共四位,可以重复 16 # chr(65-90)#a-z 17 # chr(97-122)#A-Z 18 19 方法一 20 # num_list = list(range(10)) 21 # new_num_l=list(map(str,num_list))#['0','1'...'9'] 22 # l=[] #用来存字母 23 # for i in range(65,91): 24 # zifu=chr(i) 25 # l.append(zifu) #['A'-'Z'] 26 # new_num_l.extend(l) #要把上面的数字和下面的字母拼在一块 27 # print(new_num_l) 28 # ret_l=[] #存生成的随机数字或字母 29 # for i in range(4): #从new_num_l里面选数字选择四次就放到了ret_l里面) 30 # ret_l.append(random.choice(new_num_l)) 31 # # print(ret_l) 32 # print(''.join(ret_l)) #拼成字符串 33 34 方法二 35 # import random 36 # def myrandom(): 37 # new_num_l=list(map(str,range(10))) 38 # l=[chr(i) for i in range(65,91)] 39 # new_num_l.extend(l) 40 # ret_l=[random.choice(new_num_l) for i in range(4)] 41 # return ''.join(ret_l) 42 # print(myrandom()) 43 44 方法三 45 import random 46 l=list(str(range(10)))+[chr(i) for i in range(65,91)]+[chr(j) for j in range(97,122)] 47 print(''.join(random.sample(l,4)))
4、OS模块
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10 os.remove() 删除一个文件 11 os.rename("oldname","newname") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息 13 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: 16 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示 18 os.popen("bash command) 运行shell命令,获取执行结果 19 os.environ 获取系统环境变量 20 21 22 os.path 23 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。 24 即os.path.split(path)的第二个元素 25 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 26 os.path.isabs(path) 如果path是绝对路径,返回True 27 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 28 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 29 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 30 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 31 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 32 os.path.getsize(path) 返回path的大小
注意:os.stat('path\filename') 获取文件\目录信息的结构说明
stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,<br>在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
实例:
import os # print(os.name)#输出字符串指示正在使用的平台。如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'。 # print(os.getcwd())#函数得到当前工作目录,即当前Python脚本工作的目录路径。 # print(os.listdir())#列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印。 # print(os.getcwd())#更改当前文件脚本目录,相当于shell下的cd # os.chdir(r'C:\Users\wb-sxy488976\PycharmProjects\cEshi') # print(os.getcwd()) # print(os.curdir)#返回当前目录(.) # print(os.pardir)#返回当前目录的父级目录(..) # os.makedirs('A/B/C')# 生成A/B/C文件 # os.removedirs('A/B/C')#移除A/B/C文件 # os.mkdir('D')#生成单级目录;相当于shell中mkdir dirname # os.rmdir('A/B/C')#删除单级空目录,若目录不为空则报错 # os.remove('D/111')#删除文件111 # os.rename('D','C')#重新命名文件名 文件名D换成C # print(os.stat('C'))# 获取指定文件/目录信息os.stat_result(st_mode=16895, st_ino=2533274790608707, st_dev=1855382052, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1557737135, st_mtime=1557736977, st_ctime=1557736787) # print(os.sep)#输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" # print(os.pathsep) # #输出用于分割文件路径的字符串 # os.system('ipconfig') #显示网络链接情况 # print(os.environ)#获取系统环境变量 # print(os.path.abspath('python')) #返回path规范化的绝对路径 # print(os.path.split('python'))#('', 'python')将path分割成目录和文件二元组返回 # print(os.path.basename('python.txt')) #python.txt返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 # print(os.path.exists('A')) #如果path存在,返回True;如果path不存在,返回False # print(os.path.isabs("A")) #如果path是绝对路径则返回True # print(os.path.isfile('A')) #如果path是一个存在的文件,返回True。否则返回False # print(os.path.isdir('A')) #如果path是一个存在的目录,则返回True。否则返回False # print(os.path.join((path1[, path2[, ...]])) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 —————————————————————————————————————————————————— # import time # 返回path所指向的文件或者目录的最后存取时间 # t = os.path.getatime(r'A') # x = time.localtime(t) # print(time.strftime('%Y-%m-%d %H:%M:%S',x)) # 返回path所指向的文件或者目录的最后修改时间 # t = os.path.getmtime(r'A') # x = time.localtime(t) # print(time.strftime('%Y-%m-%d %H:%M:%S',x))
5、sys模块
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.stdout.write('please:') val = sys.stdin.readline()[:-1]
实例:
import sys # name = sys.argv[1] # password = sys.argv[2] # if name == 'lala' and password == '123456': # print('go go ...') # else: # exit() # sys.exit()#退出程序,正常退出时exit(0) # print(sys.version)#3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] # print(sys.maxsize) #9223372036854775807 # print(sys.path)#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 # print(sys.platform)# win32
6、logging模块
默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。(通过basicconfig设置输出格式)
import logging logging.basicConfig(filename="file1.log", #创建接收日志文件 level=logging.DEBUG, #设置打印日志级别 format='%(asctime)s %(lineno)s %(message)s', #输出日志格式 datefmt='%Y/%m/%d %H:%M:%S') #输出时间格式 logging.debug('debug message') logging.info('info message') logging.warning('warning message') #warning 警告(从警告开始才执行) logging.error('error message') #error 错误 logging.critical('critical message') #比错误更严重的级别
日志格式(format)
%(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 |
用户输出的消息 |
Python 使用logging模块记录日志涉及四个主要类:
logger提供了应用程序可以直接使用的接口;
handler将(logger创建的)日志记录发送到合适的目的输出;
filter提供了细度设备来决定输出哪条日志记录;
formatter决定日志记录的最终输出格式。
logger
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模块可以这样:
LOG=logging.getLogger(”chat.kernel”)
Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
handler
handler对象负责发送相关的信息到指定目的地。Python的日志系统有多种Handler可以使用。有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。如果觉得不够用,还可以编写自己的Handler。可以通过addHandler()方法添加多个多handler
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择一个格式
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
每个Logger可以附加多个Handler。接下来我们就来介绍一些常用的Handler:
1) logging.StreamHandler
使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。它的构造函数是:
StreamHandler([strm])
其中strm参数是一个文件对象。默认是sys.stderr
2) logging.FileHandler
和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。它的构造函数是:
FileHandler(filename[,mode])
filename是文件名,必须指定一个文件名。
mode是文件的打开方式。参见Python内置函数open()的用法。默认是’a',即添加到文件末尾。
3) logging.handlers.RotatingFileHandler
这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。它的构造函数是:
RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
其中filename和mode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
4) logging.handlers.TimedRotatingFileHandler
这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
interval是时间间隔。
when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
S 秒
M 分
H 小时
D 天
W 每星期(interval==0时代表星期一)
midnight 每天凌晨
实例:屏幕和文件一起显示
1 import logging 2 def mylogger(filename,file=True,stream=True): 3 logger = logging.getLogger() 4 formater = logging.Formatter( 5 fmt='%(name)s %(asctime)s [%(lineno)d] ---%(message)s', 6 datefmt='%d/%m/%Y %H:%M:%S' # 时间格式 7 ) 8 logger.setLevel(logging.DEBUG) #指定日志打印的等级 9 if file: 10 file_handler = logging.FileHandler('logging.log',encoding='utf-8')# 创建一个handler,用于写入日志文件 11 file_handler.setFormatter(formater) # 文件流,文件操作符 12 logger.addHandler(file_handler) 13 if stream: 14 stream_handler = logging.StreamHandler() # 再创建一个handler,用于输出到控制台 15 stream_handler.setFormatter(formater) #屏幕流,屏幕操作流 16 #如果想让文件流和屏幕流输出的东西的格式不一样,那么就在写一个 格式formater1,这样就可以了 17 logger.addHandler(stream_handler) 18 return logger 19 logger = mylogger('logging.log',file=False) 20 logger.warning('6666666') 21 logger.debug('debug message')
思路:创建logger->创建一个file输出(创建Handler,写入日志->setformatter设置输出格式->addHandler()添加logger)->
创建一个Stream输出(创建Handler,写入日志->setformatter设置输出格式->addHandler()添加logger)->
返回 logger