import导入模块
1.定义:用来从逻辑上组织python代码(变量,函数,类,逻辑),本质就是.py结尾的python文件,实现一个功能包:python package 用来从逻辑上组织模块 本质就是一个目录(必须带有一个__init__.py的文件)2.导入方法: import moduleimport module1,module2 导入多个模块from module import * 导入所有 慎用from module import logger as logger_sunhao 创建别名from module import m1,m2,m33.import模块本质(路径搜索和搜索路径)就是把python文件解释一遍 (import test ==> test = test.py all code)导入包的本质就是执行该包下的__init__文件import module ---> module.py ----> module.py的路径---》sys.path4.导入优化:from module_test import test5.模块的分类:1.标准库time与datetime2.开源模块3.自定义模块
time&datetime 时间模块
在Python中,通常有这几种方式来表示时间:1.时间戳 2.格式化的时间字符串 3.元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时。
时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。返回时间戳方式的函数主要有time(),clock()等。
元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元组中的几个元素:
1 # -*-coding:utf-8-*- 2 import time 3 print(time.time()) #获取一个时间戳 从1970年开始按秒计时的一个浮点型数值 4 print(time.localtime()) #返回一个struct_time元组类型序列 里面元素包含年,月,日等九个元素 5 print(time.timezone) #返回一个值 单位为秒 6 print(time.asctime()) #返回当前时间字符串格式 7 time.sleep(2) #睡眠几秒 8 9 time.gmtime() #把时间戳转换成元组,但是时间是UTC时间10 time.gmtime(time.time()-86640) #把UTC时间转换成当地时间11 print(time.localtime()) #把时间戳转换成元组,但是时间是当地时间 结果为UTC+8时区
x=time.localtime() print(x.tm_year) #获取年 print(x.tm_mon) #获取月 print(time.mktime(x)) #元组转换成时间戳 time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #元组转换成格式化字符串时间 time.strptime('2017-10-17','%Y-%m-%d') #把格式化字符串转换成元组
%a 本地(locale)简化星期名称 %A 本地完整星期名称 %b 本地简化月份名称 %B 本地完整月份名称 %c 本地相应的日期和时间表示 %d 一个月中的第几天(01 - 31) %H 一天中的第几个小时(24小时制,00 - 23) %I 第几个小时(12小时制,01 - 12) %j 一年中的第几天(001 - 366) %m 月份(01 - 12) %M 分钟数(00 - 59) %p 本地am或者pm的相应符 一 %S 秒(01 - 61) 二 %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 三 %w 一个星期中的第几天(0 - 6,0是星期天) 三 %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。 %x 本地相应日期 %X 本地相应时间 %y 去掉世纪的年份(00 - 99) %Y 完整的年份 %Z 时区的名字(如果不存在为空字符) %% ‘%’字符
import datetime # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925#print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19# print(datetime.datetime.now() )# print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天# print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天# print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时# print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分 ## c_time = datetime.datetime.now()# print(c_time.replace(minute=3,hour=2)) #时间替换
random模块
import randomprint (random.random()) #0.6445010863311293 #random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 print (random.randint(1,7)) #4#random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。# 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b print (random.randrange(1,10)) #5#random.randrange的函数原型为:random.randrange([start], stop[, step]),# 从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),# 结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。# random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。 print(random.choice('liukuni')) #i #random.choice从序列中获取一个随机元素。# 其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。# 这里要说明一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。# list, tuple, 字符串都属于sequence。有关sequence可以查看python手册数据模型这一章。# 下面是使用choice的一些例子:print(random.choice("学习Python"))#学print(random.choice(["JGood","is","a","handsome","boy"])) #Listprint(random.choice(("Tuple","List","Dict"))) #List print(random.sample([1,2,3,4,5],3)) #[1, 2, 5]#random.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。
import randomimport string#随机整数:print( random.randint(0,99)) #70 #随机选取0到100间的偶数:print(random.randrange(0, 101, 2)) #4 #随机浮点数:print( random.random()) #0.2746445568079129print(random.uniform(1, 10)) #9.887001463194844 #随机字符:print(random.choice('abcdefg&#%^*f')) #f #多个字符中选取特定数量的字符:print(random.sample('abcdefghij',3)) #['f', 'h', 'd'] #随机选取字符串:print( random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )) #apple #洗牌#items = [1,2,3,4,5,6,7]print(items) #[1, 2, 3, 4, 5, 6, 7]random.shuffle(items)print(items) #[1, 4, 7, 2, 5, 3, 6]
验证码功能
import randomcheck_code=''for i in range(5): current=random.randrange(0,5) if current==i: tmp=chr(random.randrange(65,90)) else: tmp=random.randint(0,9) check_code+=str(tmp)print(check_code)
OS模块
import osos.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cdos.curdir 返回当前目录: ('.')os.pardir 获取当前目录的父目录字符串名:('..')os.makedirs('dirname1/dirname2') 可生成多层递归目录os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirnameos.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirnameos.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印os.remove() 删除一个文件os.rename("oldname","newname") 重命名文件/目录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命令,直接显示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不存在,返回Falseos.path.isabs(path) 如果path是绝对路径,返回Trueos.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
sys模块
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 错误相关
shutil模块
高级的 文件、文件夹、压缩包 处理模块
#将文件内容拷贝到另一个文件中shutil.copyfileobj(fsrc,fdst,length)
f1=open('old.xml','r')f2=open('new.xml','w')shutil.copyfileobj(f1,f2)
shutil.copyfile(src,dst) #拷贝文件shutil.copyfile('f1_old.log','f2_new.log')
shutil.copymode(src, dst) #仅拷贝权限。内容、组、用户均不变shutil.copymode('f1.log', 'f2.log')
shutil.copystat(src, dst) #仅拷贝状态的信息,包括:mode bits, atime, mtime, flags src,dst文件都必须存在shutil.copystat('f1.log', 'f2.log')
shutil.copy(src, dst) #拷贝文件和权限shutil.copy('f1.log', 'f2.log')
shutil.copy2(src, dst) #拷贝文件和状态信息
shutil.copytree(src, dst, symlinks=False, ignore=None) #递归的去拷贝文件夹shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.rmtree(path[, ignore_errors[, onerror]]) #递归的去删除文件shutil.rmtree('folder1')
shutil.move(src, dst) #递归的去移动文件,它类似mv命令,其实就是重命名。
shutil.make_archive(base_name, format,...)# 创建压缩包并返回文件路径,例如:zip、tar# 创建压缩包并返回文件路径,例如:zip、tar# base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,# 如:www =>保存至当前路径# 如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/# format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”# root_dir: 要压缩的文件夹路径(默认当前目录)# owner: 用户,默认当前用户# group: 组,默认当前组# logger: 用于记录日志,通常是logging.Logger对象#将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录 import shutilret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test') #将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录import shutilret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
import zipfile# 压缩z = zipfile.ZipFile('laxi.zip', 'w')z.write('a.log')z.write('data.data')z.close()# 解压z = zipfile.ZipFile('laxi.zip', 'r')z.extractall()z.close()zipfile解压缩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()tarfile解压缩
re模块(正则表达式)
常用正则表达式符号
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']'?' 匹配前一个字符1次或0次'{m}' 匹配前一个字符m次'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC''(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的'\Z' 匹配字符结尾,同$'\d' 匹配数字0-9'\D' 匹配非数字'\w' 匹配[A-Za-z0-9]'\W' 匹配非[A-Za-z0-9]'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' '(?P...)' 分组匹配 re.search("(?P [0-9]{4})(?P [0-9]{2})(?P [0-9]{4})","371481199306143242").groupdict("city") 结果{ 'province': '3714', 'city': '81', 'birthday': '1993'}
最常用的匹配语法
re.match # 只从开头开始匹配 re.search # 从整个文本匹配 返回一个对象 这个对象调用group()方法 查看 re.findall # 把所有匹配到的字符放到以列表中的元素返回 #返回所有满足匹配条件的结果,放在列表里re.splitall # 以匹配到的字符当做列表分隔符re.sub # 匹配字符并替换 ret = re.sub('a..a','skmb','hasascascasda') print(ret) re.splite
obj = re.compile('\.com') #编译方法 先把要匹配的字符串编译成一个对象 ret = obj.findall('asdasd.comasdas') print(ret)
hashlib模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib,hmacm1=hashlib.md5()m1.update(b"hello")print(m1.hexdigest())m1.update(b"it is me") #更新 第二次update是与第一次update拼接起来print(m1.hexdigest())m2=hashlib.md5()m2.update(b"helloit is me")print(m2.hexdigest())s1=hashlib.sha1()s1.update(b"hello")print(s1.hexdigest())s1.update(b"it is me")print(s1.hexdigest())s2=hashlib.sha1()s2.update(b"helloit is me")print(s2.hexdigest())m3=hashlib.md5()m3.update("天王盖地虎".encode(encoding="utf-8"))print(m3.hexdigest())h=hmac.new("你是二百五".encode(encoding='utf-8'))print(h.hexdigest())
paramiko模块
该模块基于SSH用于连接远程服务器并执行相关操作
SSHClient
用于连接远程服务器并执行基本命令
基于用户名密码连接:
# -*-coding:utf-8-*-# Author:sunhaoimport paramikossh= paramiko.SSHClient() #创建ssh对象# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接服务器ssh.connect(hostname='192.168.10.141',port=22,username='root',password='123456')#执行命令stdin,stdout,stderr=ssh.exec_command("ps aux ")#获取命令结果result=stdout.read()print(result.decode())#关闭链接ssh.close()
基于ssh秘钥连接
# -*-coding:utf-8-*-# Author:sunhaoimport paramikoprivate_key = paramiko.RSAKey.from_private_key_file('id_rsa') #这是192.168.10.141上的私钥ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname='192.168.10.180',port=22,username='root',pkey=private_key) #192.168.10.141上的公钥在10.180上放着stdin,stdout,stderr=ssh.exec_command("netstat -lpn;df -h;ps aux |grep ssh")#获取命令结果result=stdout.read()print(result.decode())#关闭链接ssh.close()
SFTPClient
用于连接远程服务器并执行上传下载
# -*-coding:utf-8-*-# Author:sunhaoimport paramikotransport=paramiko.Transport('192.168.10.141',22) #远程服务器为192.168.10.141transport.connect(username='root',password='123456')sftp = paramiko.SFTPClient.from_transport(transport)# 将本地paramiko模块-ssh.py 上传至服务器 /tmp/paramiko模块#sftp.put('paramiko模块-ssh.py', '/home/paramiko模块')# 将服务器/tmp/zabbix_server.log 下载到本地sftp.get('/tmp/zabbix_server.log', 'zabbix_server.log')transport.close()