《Python运维开发之路》 Python常用模块(七)

时间:2022-05-05 03:23:35

一、Python常用内置模块

用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。模块分为内置模块、自定义的模块、安装的第三方的模块。

 

目录:

  • sys
  • os
  • hashlib
  • random
  • time & datetime
  • logging
  • subProcess
  • json & pickle
  • shutil
  • shelve
  • XML
  • PyYAML
  • configparser

 

sys

 系统内置模块,此模块没有相应的*.py文件,因为它已经被集成到了python解释器中。

方法列表:

sys.argv           #命令行参数List,第一个元素是程序本身路径
sys.exit(n)        #退出程序,正常退出时exit(0)
sys.version        #获取Python解释程序的版本信息
sys.maxint         #最大的Int值
sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       #返回操作系统平台名称
sys.stdin          #输入相关
sys.stdout         #输出相关
sys.stderror       #错误相关

 

os

提供对操作系统进行调用的接口

方法列表:

os.getcwd()                 #获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")         #改变当前脚本工作目录;相当于shell下cd
os.curdir                   #返回当前目录: ('.')
os.pardir                   #获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2')    #可生成多层递归目录
os.removedirs('dirname1')   #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')         #生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')         #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')       #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()                 #删除一个文件
os.rename("oldname","new")  #重命名文件/目录
os.stat('path/filename')    #获取文件/目录信息
os.sep                      #操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep                  #当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep                  #用于分割文件路径的字符串,一般是:冒号
os.name                     #字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")   #行shell命令,直接显示,不能保存执行结果<br>os.popen("bash command").read() 运行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最后的文件名。如何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所指向的文件或者目录的最后修改时间

 

hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, 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())

还有这种:hmac模块:

散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;

一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。

>>> import hmac
>>> 
>>> mac=hmac.new(b"root",b"admin")
>>> print(mac.hexdigest())
1fd767e79cbb9a4bb7f6935e011a6a6d
>>> 

 

random

 随机数生成函数

方法列表:

import random
  
print(random.random())                                        #生成0-1之间的随机小数
print(random.randint(1, 20))                                  #生成1到20的整数包括20
print random.uniform(10, 20)                                  #生成10到20之间的浮点数
print(random.randrange(1, 10))                                #生成1到10的证书不包括10,第3个参数可以指定步长
print(random.choice(["JGood", "is", "a", "handsome", "boy"])) #从序列中随机选一个数
 
 #每次对序列随机排序
p = ["Python", "is", "powerful", "simple"]
random.shuffle(p)
print(p)

【实例】

生成验证码的例子

import random

li = []
for i in range(6):
    r = random.randint(0, 4)
    if r == 2 or r == 4:
        num = random.randrange(0, 10)
        li.append(str(num))
    else:
        temp = random.randrange(65,91)
        c = chr(temp)
        li.append(c)

result = "".join(li)
print(result)
import random

checkcode = ''
for i in range(10):
    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)

 

time & datetime

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

  • 时间戳                1970年1月1日之后的秒,即:time.time()
  • 格式化的字符串    2014-11-11 11:11,    即:time.strftime('%Y-%m-%d')
  • 结构化时间          元组包含了:年、日、星期等... time.struct_time    即:time.localtime()

 

时间互换如图:

《Python运维开发之路》 Python常用模块(七)

 

方法列表:

time

import time
 
print(time.clock())                     #返回处理器时间,3.3开始已废弃
print(time.process_time())              #返回处理器时间,3.3开始已废弃
print(time.time())                      #返回当前系统时间戳输出:1471161757.5214906
print(time.ctime())                     #输出字符串格式时间:Sun Aug 14 16:04:02 2016 ,当前系统时间
print(time.ctime(time.time()-86640))    #将时间戳转为字符串格式<br>print(time.gmtime()) #获取结构化时间
print(time.gmtime(time.time()-86640))   #将时间戳转换成struct_time格式
print(time.localtime(time.time()-86640))#将时间戳转换成struct_time格式,但返回的本地时间
print(time.mktime(time.localtime()))    #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
time.sleep(5)                           #休眠6秒
print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
print(time.strptime("2016-01-28","%Y-%m-%d") )           #将字符串格式转换成struct_time格式

 

datetime

import datetime
 
print(datetime.date.today())                            #输出格式 2018-01-1
print(datetime.date.fromtimestamp(time.time()-864400) ) #2018-01-1 将时间戳转成日期格式  
current_time = datetime.datetime.now()                  #输出当前时间
print(current_time)                                     #输出2018-01-1 19:04:30.335935
print(current_time.timetuple())                         #返回struct_time格式
  
#datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
print(current_time.replace(2014,9,12))                  #输出2018-01-1 19:06:24.074900,返回当前时间,但指定的值将被替换 
  
str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")    #将字符串转换成日期格式
new_date = datetime.datetime.now() + datetime.timedelta(days=10)                #比现在加10天
new_date = datetime.datetime.now() + datetime.timedelta(days=-10)               #比现在减10天
new_date = datetime.datetime.now() + datetime.timedelta(hours=-10)              #比现在减10小时
new_date = datetime.datetime.now() + datetime.timedelta(seconds=120)            #比现在+120s
print(new_date)

 

logging

 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug()info()warning()error() and critical() 5个级别。

 

 

 后期,学习慢慢补充

 

 

subProcess

 

json & pickle

 

 

shutil

 

shelve

 

XML

 

 

PyYAML

 

 

configparser