Python从入门到精通之常用模块学习

模块介绍

模块,是实现了某个功能的代码集合。

类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.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, SHA512MD5 算法,哈希过程不可逆。

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模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,pythonlogging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,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

每个程序在输出信息之前都要获得一个LoggerLogger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的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]]])
其中filenamemode两个参数和FileHandler一样。
maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的重名文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
4)logging.handlers.TimedRotatingFileHandler

这个HandlerRotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与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)

猜你喜欢

转载自blog.csdn.net/u010525694/article/details/79884960