我的Python升级打怪之路【五】:Python模块

时间:2022-05-20 07:11:48

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

模块的分类:

  • 自定义模块
  • 第三方模块
  • 内置模块

导入模块

 import module

 from module.xx.xx import xx

 from module.xx.xx import xx as rename

 from module.xx.xx import *

导入模块其实就是告诉Python解释器去解释哪一个PY文件

那么,我们导入模块时,是根据哪一个路径作为基准来进行的呢?

 import sys

 print(sys.path)

如果路径不在其中,我们可以人为添加一下

 import sys

 sys.path.append(路径)

模块

一、sys模块

用于提供对Python解释器相关的操作

 sys.argv            #命令行参数List,第一个元素是程序本身的路径

 sys.exit(n)        #退出程序,并打印n,正常退出exit(0)

 sys.version        #获取Python解释器的版本信息

 sys.maxint        #最大的int值

 sys.path            #返回模块搜索路径

 sys.platform        #返回操作系统的平台名称

 sys.stdin            #输入相关

 sys.stdout            #输出相关

 sys.stderror            #错误相关
 import sys
import time def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
r = '\r%d%%' % (rate_num, )
sys.stdout.write(r)
sys.stdout.flush() if __name__ == '__main__':
for i in range(0, 100):
time.sleep(0.1)
view_bar(i, 100)

sys实现进度条

二、os模块

用于提供系统级别的操作

 os.getcwd()            #获取当前工作目录,即Python脚本工作的目录路径
os.chdir(路径) #改变当前脚本的工作目录
os.curdir #返回当前目录 ('.')
os.makedirs('1/2') #可生成多层递归目录
os.removedirs('path') #若目录为空,则删除,并递归到上一级目录,依次类推
os.mkdir() #生成单级目录
os.rmdir() #删除单级目录
os.listdir() #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() #删除一个文件
os.rename() #重命名文件/目录
os.stat() #获取文件/目录的信息
os.sep #操作系统特定的路径分割符
os.linesep #当前平台的终止符
os.pathsep #当前平台的路径分隔符
os.name #字符串只是当前的平台
os.system() #运行命令
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最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) #如果path是绝对路径,返回True
os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间

三、haslib模块

用于加密的相关操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA384,SHA512,MD5算法

 import hashlib

 # ######## md5 ########
hash = hashlib.md5()
# help(hash.update)
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest()) ######## sha1 ######## hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

对加密算法中添加自定义key加密

 import hashlib

 # ######## md5 ########

 hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
hash.update(bytes('admin',encoding="utf-8"))
print(hash.hexdigest())

结合自定义key和hmac模块进行加密

 import hmac

 h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
h.update(bytes('admin',encoding="utf-8"))
print(h.hexdigest())

四、random模块

使用:

 import random

 print(random.random())
print(random.randint(1, 2))
print(random.randrange(1, 10))
 import random
checkcode = ''
for i in range(4):
current = random.randrange(0,4)
if current != i:
temp = chr(random.randint(65,90))
else:
temp = random.randint(0,9)
checkcode += str(temp)
print checkcode

random实现随机验证码

五、re正则模块

字符:

  .          匹配除换行符以外的任意字符

  \w        匹配字母或数字或下划线或汉字

  \s    匹配任意空白符

  \d         匹配数字

  \b    匹配单词的开始或结束

  ^   匹配字符串的开始

  $   匹配字符串的结束

次数:

  *   重复0次或更多次

  +   重复一次或更多次

  ?   重复0次或1次

  {n}   重复n次

  {n,}  重复n次或更多次

  {n,m}    重复n到m次  

match:从起始位置开始匹配,匹配成功返回一个对象,未成功返回None

match(pattern,string,flags=0)
# pattern :正则模型
# string :要匹配的字符串
# falgs :匹配的模式
 # 无分组
r = re.match("h\w+", origin)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组结果 # 有分组 # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来) r = re.match("h(\w+).*(?P<name>\d)$", origin)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

例子

search:浏览整个字符串去匹配第一个,未匹配成功返回None

search(pattern,string,flags=0)
         # 无分组

         r = re.search("a\w+", origin)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组结果 # 有分组 r = re.search("a(\w+).*(?P<name>\d)$", origin)
print(r.group()) # 获取匹配到的所有结果
print(r.groups()) # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

例子

findall:获取非重复的匹配列表;如果有分组,则组以元组的形式返回

findall(pattern, string, flags=0)
         # 无分组
r = re.findall("a\w+",origin)
print(r) # 有分组
origin = "hello alex bcd abcd lge acd 19"
r = re.findall("a((\w*)c)(d)", origin)
print(r)

例子

sub:替换匹配成功的指定位置的字符串

sub(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl : 要替换的字符串或可执行对象
# string : 要匹配的字符串
# count : 指定匹配个数
# flags : 匹配模式
         # 与分组无关

         origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a\w+", "", origin, 2)
print(r)

例子

split:根据正则分割字符串

split(pattern, string, maxsplit=0, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# maxsplit:指定分割个数
# flags : 匹配模式
         # 无分组
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("alex", origin, 1)
print(r) # 有分组 origin = "hello alex bcd alex lge alex acd 19"
r1 = re.split("(alex)", origin, 1)
print(r1)
r2 = re.split("(al(ex))", origin, 1)
print(r2)

例子

 IP:
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
手机号:
^1[3|4|5|8][0-9]\d{8}$
邮箱:
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+

re实现匹配IP,手机号,邮箱

六、序列化

Python中序列化的模块:

  • json  用于【字符串】和【Python基本数据类型】之间的转换
  • pickle     用于【Python特有的类型】和【Python基本数据类型】之间的转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

七、requests

1.requests模块的安装

pip  install  requests

2.使用模块

GET请求

import requests

#无参数
ret = requests.get('https://www.baidu.com')
print(ret.url)
print(ret.text) #有参数
payload = {'k':'v'}
ret = requests.get('https://www.baidu.com',params = payload)
print(ret.url)
print(ret.text)

POST请求

import requests

#基本
payload = {'k':'v'}
ret = requests.post('https://www.baidu.com',data=payload)
print(ret.text) #带请求头和数据
import json
url = "https://www.baidu.com"
payload = {'k':'v'}
headers = {'content-type': 'application/json'} ret =requests.post(url,data=json.dumps(payload),headers=headers) print(ret.text) print(ret.cookies)
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)

其他的一些请求

八、logging日志模块

用于便捷记录日志且线程安全的模块

1.单文件日志

 import logging

 logging.basicConfig(filename='log.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')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')

日志的等级:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

补充:只有大于定义的日志等级时才会被记录

2.多文件日志

 # 定义文件
file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
file_1_1.setFormatter(fmt) file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt) # 定义日志
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2) # 写日志
logger1.critical('')
 # 定义文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt) # 定义日志
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)

九、subprocess模块-系统命令

call:执行命令,返回状态码,成功为0,失败为1

 ret = subprocess.call(['ls','-l'],shell=False)

 ret = subprocess.call("ls -l",shell=True)

check_call:执行命令,成功返回0,失败抛出异常

 subprocess.check_call(['ls','-l'],shell=False)

 subprocess.check_call("ls -l",shell=True)

check_output:用法和check_call相同

subprocess.Popen()  用于执行复杂的命令

import subprocess

ret1 = subprocess.Popen(["mkdir",''])

ret2 = subprocess.Popen("mkdir 2",shell=True)

subprocess.Popen()参数:

  • args:shell命令,可以是字符串或者是序列类型
  • bufsize:指定缓冲,0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
  • stdin,stdout,stderr:分别表示程序的标准输入、输出、错误句柄
  • close_sfs:在windows下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
  • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象,它将在子进程运行之前被调用
  • cwd:用于设置子进程的当前目录
  • env:用于指定子进程的环境变量,如果env = None,子进程的环境变量将从父进程中继承
  • startupinfo与createionflags只在windows下有效,将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等

终端的输入的命令分为两种:

  • 输入即可得到输出
  • 输入进行某环境,以来再输入
 输入进行某环境,以来再输入的例子
 import subprocess

 obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
obj.stdin.close() cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close() print(cmd_out)
print(cmd_error)

十、shutil模块

高级的 文件、文件夹、压缩包处理模块

shutil.copyfileobj(fsrc,fdst,length)   将文件内容拷贝到另一个文件中

import shutil

shutil.copyfileobj(open('old.xml','r'),open('new.xml','w'))

shutil.copyfile(src,dst)    拷贝文件

shutil.copyfile('','')

shutil.copymode(src,dst)   仅拷贝权限。内容、组、用户都不变

shutil.copymode('','')

shutil.copystat(src,dst)     仅拷贝状态的信息

shutil.copystat('','')

shutil.copy(src,dst)   拷贝文件和权限

shutil.copy('','')

shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)   递归拷贝文件夹

import shutil

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
#ignore表示排除某些

shutil.rmtree()      递归的去删除文件

shutil.rmtree(文件)

shutil.make_archive(base_name,format,.....)

创建压缩包并返回文件路径

  • base_name:压缩包的文件名,也可以是路径
  • format:压缩包的种类,“zip”,“tar”,“bztar”,“gztar”
  • root_dir:要压缩的文件夹路径
  • owner:用户,默认当前用户
  • group:组,默认当前组
  • logger:用于记录日志,通常是logging.Logger对象
shutil.make_archive('被压缩的文件夹路径','gztar',root_dir="放置路径")

补充:shutil对压缩包的处理是调用了ZipFile和TarFiel两个模块来进行的。

zipfile模块

import zipfile

#压缩
z = zipfile.ZipFile('1.zip','w')
z.write('a.log')
z.write("data.data")
z.close() #解压
z = zipfile.ZipFile('1.zip','r')
z.extractall()
z.close()

tarfile模块

import tarfile

# 压缩
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close() # 解压
tar = tarfile.open('your.tar','r')
tar.extractall() # 可设置解压地址
tar.close()

十一、paramiko

paramiko是一个用于做远程控制的模块,该模块可以实现对远程服务器进行命令或文件操作

1.下载安装

pip  install  pycrypto

pip  install  paramiko

2.模块使用

 import paramiko

 ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.108', 22, 'alex', '')
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()
ssh.close()

执行命令 - 基于用户名和密码

 import paramiko

 private_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('主机名 ', 端口, '用户名', key) stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read()
ssh.close()

执行命令 - 基于密钥

 import os,sys
import paramiko t = paramiko.Transport(('182.92.219.86',22))
t.connect(username='wupeiqi',password='')
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('/tmp/test.py','/tmp/test.py')
t.close() import os,sys
import paramiko t = paramiko.Transport(('182.92.219.86',22))
t.connect(username='wupeiqi',password='')
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get('/tmp/test.py','/tmp/test2.py')
t.close()

文件上传下载 - 用户名密码

 import paramiko

 pravie_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22))
t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('/tmp/test3.py','/tmp/test3.py') t.close() import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa'
key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22))
t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t)
sftp.get('/tmp/test3.py','/tmp/test4.py') t.close()

文件上传下载 - 密钥

十二、time时间模块

时间的相关操作,时间有三种表现方式:

  • 时间戳         time.time()     时间从1970年1月1日之后
  • 格式化的字符串      time.strftime("%Y-%m-%d")
  • 结构化时间        time.localtime()
 time.time()     #时间戳
time.mktime(time.localtime()) time.gmtime() #可加时间戳参数
time.localtime() #可加时间戳参数
time.strptime('2018-11-11', '%Y-%m-%d') #格式化时间 time.strftime('%Y-%m-%d') #默认当前时间
time.strftime('%Y-%m-%d',time.localtime()) #默认当前时间
time.asctime()
time.asctime(time.localtime())
time.ctime(time.time()) import datetime
'''
datetime.date:表示日期的类。常用的属性有year, month, day
datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
datetime.datetime:表示日期时间
datetime.timedelta:表示时间间隔,即两个时间点之间的长度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")
'''
import datetime
datetime.datetime.now()
datetime.datetime.now() - datetime.timedelta(days=5)