模块介绍
模块,是实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os
是系统相关的模块;file
是文件操作相关的模块
模块分为三种:
- 自定义模块
- 内置标准模块(又称标准库)
- 开源模块
自定义模块 和开源模块的使用参考 这里。
time&datetime模块
import time
print(time.altzone) # 返回与utc时间的时间差,以秒计算
print(time.asctime()) # 返回时间格式 Thu Apr 12 14:29:19 2018
print(time.localtime()) # 返回本地时间的struct_time对象格式 time.struct_time(tm_year=2018, tm_mon=4, tm_mday=12, tm_hour=14, tm_min=31, tm_sec=9,
)
print(time.gmtime(time.time()-0)) # 将时间戳转换成struct_time格式: time.struct_time(tm_year=2018, tm_mon=4, tm_mday=12, tm_hour=6, tm_min=33, tm_sec=11, tm_wday=3, tm_yday=10
)
print(time.asctime(time.localtime())) # 将struct_time格式转换成易读格式 Thu Apr 12 14:36:19 2018
print(time.ctime()) # 返回当前时间:Thu Apr 12 14:36:55 2018
# 日期字符串 ---> 时间戳
struct = time.strptime("2018/04/12", "%Y/%m/%d") # 将字符串转换成struct对象格式 time.struct_time(tm_year=2018, tm_mon=4, tm_mday=12, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=102, tm
)
# struct时间对象 ---> 时间戳
stamp = time.mktime(struct) # 将struct时间对象转换成时间戳 1523462400.0
# 时间戳 ---> 字符串格式时间
struct = time.gmtime(time.time())) # 先将utc时间戳转换成struct时间对象
print(time.strftime("%Y-%m-%d %H:%M:%S", struct) # 再将strcut时间对象转换成字符串时间格式
# 时间加减
import datetime
print(datetime.datetime.now()) # 2018-04-12 14:59:02.210024
print(datetime.date.fromtimestamp(time.time())) # 将时间戳直接转换成日期 2018-04-12
print(datetime.datetime.now() + datetime.timedelta(3)) # 当前时间 +3 天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) # 当前时间 +3 小时
# 时间替换
c_time = datetime.datetime.now() # 2018-04-12 15:06:52.645780
print(c_time.replace(minute=3, hour=2))
# 2018-04-12 02:03:52.645780
random模块
import random
print(random.random()) # 返回0~1 随机数
random.randint(1,8) # 随机返回1~8(包括8)之间的整数
random.randrange(1,8) # 随机返回1~8(不包括8)之间的整数
list = [1,2,3,4]
print(random.choice(list)) # 从l中随机选择一个元素返回
print(random.sample(list, 2)) # 从序列中随机选择n个元素返回 [1, 3]
random.shuffle(list) # shuffle方法将列表顺序随机打乱并返回None
print(list) # [3, 1, 2, 4]
++++++++++++++++++++++++++++++
# 验证码生成
import random
def check_gen():
"""随机生成验证码"""
checkcode = ''
for i in range(4):
cur = random.randint(1, 30)
if 15 > cur >= 1: # 大写字母
tmp = chr(random.randint(65, 90))
elif 25 > cur >= 15: # 小写字母
tmp = chr(random.randint(97, 122))
else: # 数字
tmp = random.randint(0, 9)
checkcode += str(tmp)
print(checkcode)
if __name__ == '__main__':
check_gen()
OS模块
该模块提供对操作系统进行调用的接口。
import os
os.getcwd() # 获取当前python脚本工作目录
os.chdir('dirname') # 改变当前脚本工作目录, 相当于cd命令
os.makedirs('dir1/dir2') # 可生成多层递归目录
os.removedirs('dir1/dir2') # 从内向外递归删除空目录
os.mkdir('dirname') # 生成单级目录,相当于mkdir dirname
os.rmdir('dirname') # 删除单级目录,若目录非空则报错
os.listdir('dirname') # 以列表形式列出目录下所有文件和子目录
os.remove('filename') # 删除一个文件
os.rename('oldname', 'newname') # 重命名 目录/文件
os.stat('path/filename') # 获取目录/文件信息
os,sep # 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep # 输出用于分割文件路径的字符串,如环境变量
os.system("bash command") # 运行shell命令,直接显示
os.environ # 获取系统环境变量
os.path.abspath('path') # 返回path的绝对路径
os.path.split('path') # 将path分成两段组成一个元组返回,最后一部分无/
os.path.dirname('path') # 返回path所在目录,即os.path.split('path')的第一个元素
os.path.basename('path') # 返回path最后一段内容,即os.path.split(path)的第二个元素 如果path以/或\结尾,那么就会返回空值
os.path.exists('path') # 判断目录或文件是否存在
os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) # 如果path是一个存在的目录,则返回True。否则返回False
os.path.join('path1','path2',..., 'filename') # 拼接路径
os.path.getatime(path) # 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) # 返回path所指向的文件或者目录的最后修改时间
更多请点击这里。
sys模块
import sys
sys.argv # 命令行参数列表,第一个元素为程序本身路径
sys.exit(n) # 退出程序,正常退出时exit(0)
sys.version # 返回Python解释程序的版本信息
sys.path # 返回模块的搜索路径,初始化时为Python的环境变量
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
hashlib模块
该模块用于加密相关的操作,主要提供 SHA1
, SHA224
, SHA256
, SHA384
, SHA512
,MD5
算法,哈希过程不可逆。
import hashlib
m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest()) # 二进制格式hash
print(m.hexdigest()) # 16进制格式hash
# sha1, sha256, sha384, sha512用法类似
logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python
的logging
模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging
的日志可以分为 debug()
, info()
, warning()
, error()
和critical()
5个级别,下面我们看一下怎么用。
最简单用法:
import logging
logging.warning("user [Lee] attempted wrong password for more than 3 times!")
logging.critical("Server disconnected!!!")
++++++++++++++++++++++++++++++
WARNING:root:user [Lee] attempted wrong password for more than 3 times!
CRITICAL:root:Server disconnected!!!
如果想把日志写到文件里,也很简单:
import logging
logging.basicConfig(filename='example.log', level=logging.INFO)
logging.debug("This is a Debug massage.")
其中下面这句中的level=loggin.INFO
意思是,把日志纪录级别设置为INFO
,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug
的日志,那把日志级别改成DEBUG
就行了。
感觉上面的日志格式忘记加上时间啦,日志不知道时间怎么行呢,下面就来加上!
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
日志格式
%(name)s Logger的名字
%(levelno)s 数字格式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(modules)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 用户输出的消息
如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识 了
Python 使用logging
模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
logger
提供了应用程序可以直接使用的接口;
handler
将(logger
创建的)日志记录发送到合适的目的输出;
filter
提供了细度设备来决定输出哪条日志记录;
formatter
决定日志记录的最终输出格式。
Logger
每个程序在输出信息之前都要获得一个Logger
。Logger
通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger
:
LOG=logging.getLogger(”chat.gui”)
而核心模块可以这样:
Logger=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
达到指定的大小之后,RotatingFile
这里写代码片Handler
自动把 文件改名为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 每天凌晨
import logging
#create logger
logger = logging.getLogger('TEST-LOG')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create file handler and set level to warning
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch and fh
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
一个例子
import logging
from logging import handlers
logger = logging.getLogger(__name__)
log_file = "timelog.log"
#fh = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3)
fh = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3)
formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.warning("test1")
logger.warning("test12")
logger.warning("test13")
logger.warning("test14")
ConfigParser模块
该模块用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。
来看一个好多软件的常见文档格式如下:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
如果想用python生成一个这样的文档怎么做呢?
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022' # mutates the parser
topsecret['ForwardX11'] = 'no' # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
config.write(configfile)