模块

一、定义

模块:用来从逻辑上组织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-992 %Y 四位数的年份表示(000-99993 %m 月份(01-124 %d 月内中的一天(0-315 %H 24小时制小时数(0-236 %I 12小时制小时数(01-127 %M 分钟数(00=598 %S 秒(00-599 %a 本地简化星期名称
10 %A 本地完整星期名称
11 %b 本地简化的月份名称
12 %B 本地完整的月份名称
13 %c 本地相应的日期表示和时间表示
14 %j 年内的一天(001-36615 %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)))
View Code

 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))
View Code

 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
View Code

 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

posted @ 2019-05-15 14:47  Delta.Farce  阅读(168)  评论(0编辑  收藏  举报