常用的基础模块介绍
模块,是用一堆代码来实现某个功能的代码集合
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码来调用该功能,提供了代码的重用性和代码间的耦合性
而对于一个复杂的功能,可能需要多个函数才能完成,这些文件组成的代码集合称为模块
模块分为三种:自定义模块;内置标准模块;开源模块
模块一:datetime和time
1 import time 2 print("返回标准时间(含年月日等信息):",time.asctime()) 3 print("返回本地时间的struct time时间格式:",time.localtime()) 4 print("返回utc的struct时间对象格式:",time.gmtime(time.time()-800000)) 5 print("返回标准时间格式:",time.asctime(time.localtime())) 6 print("返回标准时间格式:",time.ctime()) 7 # # 8 # # #将日期字符串转换成时间戳 9 string2_struct=time.strptime("2016/10/22","%Y/%m/%d") 10 print("将日期字符串转换成struct格式:",string2_struct) 11 # # 12 struct_2_stamp=time.mktime(string2_struct) 13 print("将struct转换成时间戳:",struct_2_stamp) 14 # # 15 # # #将时间戳转换为字符串 16 print(time.gmtime(time.time()-86640)) #将utc时间戳转换成structtime格式 17 print(time.altzone) 18 # # 19 # # #将utc struct_time 格式转成指定的字符串格式 格式化时间格式 20 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())) 21 # # 22 # # 23 # # #datetime 24 import datetime 25 print("返回系统当前时间:",datetime.datetime.now()) 26 print("标准格式;",datetime.datetime.fromtimestamp(time.time())) 27 # # #时间加减 28 print("当前时间加三天:",datetime.datetime.now()+datetime.timedelta(3)) 29 print("当前时间减三天:",datetime.datetime.now()+datetime.timedelta(-3)) 30 print("当前时间加三小时:",datetime.datetime.now()+datetime.timedelta(hours=3)) 31 print("当前时间加30分钟:",datetime.datetime.now()+datetime.timedelta(minutes=30)) 32 # # 33 # # #时间替换,即对现有时间的修改 34 c_time=datetime.datetime.now() 35 print(c_time.replace(minute=3,hour=2))
模块二:random 随机数
1 import random 2 print(random.randint(1,2)) 3 print(random.randrange(1,3)) 4 # # 5 # # #生成随机验证码 6 checkcode="" 7 for i in range(4): 8 current=random.randrange(0,4) 9 if current!=i: 10 temp=chr(random.randint(65,90)) 11 else: 12 temp=random.randint(0,9) 13 checkcode+=str(temp) 14 print("验证码为:",checkcode) 15 # # 16 # # # print("生成65-90之间的随机数:",random.randint(65,90)) 17 # # # print("根据ASCII码转换:",chr(random.randint(65,90)))
模块三:os模块:用于提供系统级别的操作
1 import random 2 print(random.randint(1,2)) 3 print(random.randrange(1,3)) 4 # # 5 # # #生成随机验证码 6 checkcode="" 7 for i in range(4): 8 current=random.randrange(0,4) 9 if current!=i: 10 temp=chr(random.randint(65,90)) 11 else: 12 temp=random.randint(0,9) 13 checkcode+=str(temp) 14 print("验证码为:",checkcode) 15 # # 16 # # # print("生成65-90之间的随机数:",random.randint(65,90)) 17 # # # print("根据ASCII码转换:",chr(random.randint(65,90)))
1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 2 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 3 os.curdir 返回当前目录: ('.') 4 os.pardir 获取当前目录的父目录字符串名:('..') 5 os.makedirs('dir1/dir2') 可生成多层递归目录 6 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 8 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10 os.remove() 删除一个文件 11 os.rename("oldname","new") 重命名文件/目录 12 os.stat('path/filename') 获取文件/目录信息 13 os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/" 14 os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" 15 os.pathsep 用于分割文件路径的字符串 16 os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix' 17 os.system("bash command") 运行shell命令,直接显示 18 os.environ 获取系统环境变量 19 os.path.abspath(path) 返回path规范化的绝对路径 20 os.path.split(path) 将path分割成目录和文件名二元组返回 21 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 22 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 23 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 24 os.path.isabs(path) 如果path是绝对路径,返回True 25 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 26 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 27 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 29 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
模块四:sys 用来提供解释器的相关操作
1 import sys #用来提供对解释器的相关操作 2 print("返回模块的搜索路径,初始化时使用环境变量的值:",sys.path) 3 print(sys.argv) #命令行参数list,第一个元素是程序本身路径
1 import sys 2 import time 3 4 5 def view_bar(num, total): 6 rate = float(num) / float(total) 7 rate_num = int(rate * 100) 8 r = '\r%d%%' % (rate_num, ) 9 sys.stdout.write(r) 10 sys.stdout.flush() 11 12 13 if __name__ == '__main__': 14 for i in range(0, 100): 15 time.sleep(0.1) 16 view_bar(i, 100)
模块五:hashlib 用于加密相关的 操作,提供了MD5和Sha模块,主要提供SHA1/SHA224/SHA256/SHA384/SHA512/MD5算法
1 import hashlib 2 m=hashlib.md5() 3 m.update(b"Hello") 4 print("二进制格式加密:",m.digest()) 5 print("十六进制加密:",m.hexdigest(),len(m.hexdigest())) 6 7 #sha1 8 s1=hashlib.sha1() 9 s1.update(b"Hello world") 10 print("SHA1:",s1.hexdigest(),len(s1.hexdigest())) 11 12 s2=hashlib.sha224() 13 s2.update(b"Hello world") 14 print("SHA224:",s2.hexdigest(),len(s2.hexdigest())) 15 16 s3=hashlib.sha256() 17 s3.update(b"Hello world") 18 print("SHA256:",s3.hexdigest(),len(s3.hexdigest())) 19 20 s4=hashlib.sha384() 21 s4.update(b"Hello world") 22 print("SHA384:",s4.hexdigest(),len(s4.hexdigest())) 23 24 s5=hashlib.sha512() 25 s5.update(b"Hello world") 26 print("SHA512:",s5.hexdigest(),len(s5.hexdigest())) 27 # # #由上述例子可以看出,不同的加密算法位数是不一样的,随着指数的增大,加密位数越来越多 28 # # #但是上述方法的加密可以通过撞库来反解,可以通过对加密算法添加自定义key来加密 29 m2=hashlib.md5(b"8jindeod098") 30 m2.update(b"Hello") 31 print("自定义参数加密:",m2.hexdigest()) 32 # # 33 # # #更加牛逼的加密方式 内部对我们创建key和内容再进行处理后然后再加密 34 import hmac 35 h=hmac.new(b"Eric") 36 h.update(b"Hello world") 37 print("HMac:",h.hexdigest())
1 #生成随机验证码的函数 2 def code(): 3 _code = list() 4 for i in range(4): 5 ra = random.randrange(4) 6 if i == ra: 7 _code.append(chr(random.randrange(97, 122))) 8 else: 9 _code.append(str(i)) 10 result = ''.join(_code) 11 return result 12 print("123:",code())
模块六:pickle,json
1 import pickle,json 2 data={"k1":123,"k2":"Hello"} 3 # # #pickle.dumps将数据通过特殊的形式转换为只有python语言认识的字符串 4 p_str=pickle.dumps(data) 5 print(p_str) 6 ss=pickle.loads(p_str) 7 print("111",ss) 8 # # 9 # # #pickle.dump将数据通过特殊形式转换为只有python认识的字符串,并写入文件 10 with open("result.pk","w") as f: 11 pickle.dump(data,f) 12 # # 13 import json 14 # # #json.dumps 将数据通过特殊的形式转换为所有程序语言都认识的字符串 15 j_str=json.dumps(data) 16 print(j_str) 17 # # 18 # # #json.dump将数据通过特殊形式转换为只有python认识的字符串,并写入文件 19 with open("result.json","w") as fp: 20 json.dump(data,fp)
1 import json,pickle 2 #json 用于【字符串】和【python】基本数据类型之间的转换 3 #pickle 用于【python特有的类型】和【python基本数据类型之间的转换】 4 data={"k1":123,"k2":"Hello"} 5 p_str=pickle.dumps(data) 6 print("pickle.dumps:",type(p_str),p_str) #转换为字节类型 7 #dump将数据通过特殊的形势转换为只有python语言认识的字符串,并写入文件 8 with open("dump.pk","wb") as fp: 9 pickle.dump(data,fp) 10 11 #json.dumps将数据通过特殊的形式转换为所有语言都认识的字符 12 j_str=json.dumps(data) 13 print("json.dumps:",j_str,type(j_str)) #转换为字符串类型 14 15 #json.dump将数据通过特殊的形式转换为所有语言都认识的字符,并写入文件 16 with open("json.pk","w") as fj: #字符串可以直接写入 17 json.dump(data,fj)
模块七:正则表达式 re
1 import re 2 # # #正则表达式相关操作 3 print() 4 print("--------------------分隔符----------------------") 5 origin = "hel1lo al2ex b1cd ab3cd lge acd 19" 6 r=re.match("\w+",origin) #从头开始匹配,匹配成功返回一个对象,不成功返回NONE 7 print("获取匹配的所有结果:",r.group()) 8 #分组:提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来) 9 print("获取匹配的分组结果:",r.groups()) 10 11 #浏览整个字符串去匹配第一个,未匹配成功返回None 12 r=re.search("\d+",origin) 13 print("浏览整个字符串,匹配第一个:",r.group()) 14 #获取非重复的匹配列表,如果有一组则用列表形式返回 15 r=re.findall("\d+",origin) 16 print(r) 17 #替换匹配成功指定位置的字符串 18 r=re.sub("\d+","8888",origin,1) 19 print("替换匹配成功指定位置的字符串:",r) 20 21 #split 根据正则匹配分割字符串 22 r=re.split("\d+",origin) 23 print("split:",r) 24 25 origin1 = "hello alex bcd alex lge alex acd 19" 26 r1 = re.split("(alex)", origin1, 1) 27 print("用alex来拆分,但是保留Alex:",r1) 28 r2 = re.split("(al(ex))", origin1, 1) 29 print("用alex或ex来拆分,但是均保留:",r2) 30 31 #匹配IP地址 32 str_ip="Hello,222.168.16.60,Welcome,13783417293,172560199@sina.com" 33 m=re.search("((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)",str_ip) 34 print("匹配到的IP是:",m.group()) 35 m1=re.search("(1)([358]\d{9})",str_ip) 36 print("匹配到的电话为:",m1.group()) 37 m2=re.search("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+",str_ip) 38 print("匹配到的邮箱是:",m2.group())
模块八:configparser用于处理特定格式的文件,其本质是利用open来操作文件
1 import configparser 2 config=configparser.ConfigParser() 3 config.read("Hello world",encoding="utf-8") 4 ret=config.sections() 5 print("获取所有的节点:",ret) 6 7 #获取指定节点下的键值对 8 ret1=config.items("sections1") 9 print("获取sections1下的键值对:",ret1) 10 #获取制定节点下的所有键 11 ret2=config.options("sections1") 12 print(ret2) 13 #获取指定节点下指定key值 14 v=config.get("section1","k1") 15 print(v) 16 17 # 检查、删除、添加节点 18 has_sec=config.has_section("section1") 19 print("是否存在节点:",has_sec) 20 21 #添加节点 22 config.add_section("sect1") 23 config.write(open("Hello","w")) 24 ret=config.sections() 25 print("查看节点是否添加成功:",ret) 26 27 #删除节点 28 config.remove_section("sect1") 29 config.write(open("Hello","w")) 30 ret=config.sections() 31 print("查看节点是否删除成功:",ret) 32 33 #检查、删除、设置指定组内的键值对 34 #检查是否存在键:k1 35 has_opt=config.has_option("sect1","k1") 36 print(has_opt) 37 38 #删除指定节点下的指定键 39 config.remove_option("sect1","k1") 40 config.write(open("Hello","w")) 41 42 #设置指定节点下的键值对 43 config.set("sect1","k10","123") 44 config.write(open("Hello","w"))
模块九:XML是实现不同语言或程序之间进行数据交换的协议
1 # #XML是实现不同语言或程序之间进行数据交换的协议 2 #1、解析XML 3 from xml.etree import ElementTree as ET 4 #打开文件,读取XML内容,xo为xml文件 5 str_xml=open("xo","r").read() 6 # #将字符串解析成xml特殊对象,root代指xml文件的根节点 7 root=ET.XML(str_xml) 8 print(root) 9 # 10 # #直接解析xml文件 11 tree=ET.parse("xo") 12 # #获取xml文件的根节点 13 root1=tree.getroot() 14 print(root1) 15 # 16 # #遍历xml文档的所有内容 17 # #顶层标签 18 print("获取顶层节点:",root1.tag) 19 #遍历xml文档的第二层 20 for child in root1: 21 #第二层节点的标签名和标签属性 22 print(child.tag,child.attrib) 23 #遍历xml 文档的第三层 24 for i in child: 25 print(i.tag,i.text) 26 27 28 #遍历xml中指定的节点year 29 for node in root1.iter("year"): 30 print(node.tag,node.text) 31 32 #修改节点的内容,由于修改节点时,均是在内存中进行,其不会影响文件中的内容 33 #因此如果需要修改,则需要将重新将内存中的文件写入到文件 34 35 for node in root1.iter("year"): 36 #将year节点中的内容自增1 37 new_year=int(node.text)+1 38 node.text=str(new_year) 39 #设置属性 40 node.set("name","eric") 41 node.set("age","99") 42 #删除属性 43 del node.attrib["name"] 44 # 45 # #保存文件 46 tree=ET.ElementTree(root1) 47 tree.write("newnew.xml",encoding="utf-8") 48 # 49 for country in root1.findall("country"): 50 #获取每一个country节点下rank节点的内容 51 rank=int(country.find("rank").text) 52 print(rank) 53 54 if rank>50: 55 root1.remove(country) 56 # 57 # #保存文件 58 tree=ET.ElementTree(root1) 59 tree.write("new1.xml",encoding="utf-8") 60 61 #创建XML文档 62 #创建根节点 63 root2=ET.Element("family") 64 #创建节点子节点 65 son1=ET.Element("son",{"name":"son1"}) 66 son2=ET.Element("son",{"name":"son2"}) 67 #在第一个子节点中创建两个孙节点 68 grandson1=ET.Element("grandson",{"name":"111"}) 69 grandson2=ET.Element("grandson",{"name":"222"}) 70 son1.append(grandson1) 71 son1.append(grandson2) 72 73 #将子节点添加到根节点中 74 root2.append(son1) 75 root2.append(son2) 76 77 tree=ET.ElementTree(root2) 78 tree.write("create1.xml",encoding="utf-8",short_empty_elements=False) 79 80 #创建xml文档方法二 81 root=ET.Element("family") 82 #创建子节点,调用根节点的makeelementff 83 son1=root.makeelement("son1",{"name":"son1"}) 84 son2=root.makeelement("son2",{"name":"son2"}) 85 86 #在son1中创建两个孙子节点 87 grandson11=son1.makeelement("grandson11",{"name":"555"}) 88 grandson12=son1.makeelement("grandson12",{"name":"666"}) 89 90 son1.append(grandson11) 91 son1.append(grandson12) 92 93 root.append(son1) 94 root.append(son2) 95 96 tree1=ET.ElementTree(root) #生成文档对象 97 tree1.write("create2.xml",encoding="utf-8",short_empty_elements=False) #将文档对象写入文件 98 99 #创建xml文档方法三 100 #利用ET的SubElement方法进行创建 101 root=ET.Element("family") #创建根节点 102 #创建第一个子节点 103 son1=ET.SubElement(root,"son1",attrib={"name":"son111"}) 104 son2=ET.SubElement(root,"son2",attrib={"name":"son222"}) 105 106 #在第一个子节点中创建孙节点 107 grandson1=ET.SubElement(son1,"grandson11",attrib={"name":"grandson666"}) 108 grandson1.text="孙子" 109 et=ET.ElementTree(root) 110 et.write("test.xml",encoding="utf-8",xml_declaration=True,short_empty_elements=False) 111 112 #由上述例子的执行结果来看,均无法实现xml的缩进,若想要缩进的话,需要修改保存格式 113 from xml.dom import minidom 114 def prettify(elem): 115 """ 116 将节点转换成字符串,并添加缩进 117 :param elem:要转换的对象 118 :return: 119 """ 120 rough_string=ET.tostring(elem,"utf-8") 121 reparsed=minidom.parseString(rough_string) 122 return reparsed.toprettyxml(indent="\t") 123 #利用ET的SubElement方法进行创建 124 root=ET.Element("family") #创建根节点 125 #创建第一个子节点 126 son1=ET.SubElement(root,"son1",attrib={"name":"son111"}) 127 son2=ET.SubElement(root,"son2",attrib={"name":"son222"}) 128 129 #在第一个子节点中创建孙节点 130 grandson1=ET.SubElement(son1,"grandson11",attrib={"name":"grandson666"}) 131 grandson1.text="孙子" 132 133 raw_str=prettify(root) 134 with open("test2.xml","w",encoding="utf-8") as f: 135 f.write(raw_str)
模块十:urllib和requests
1 import urllib.request 2 #python标准库中提供了:urllib等模块以供http请求,但是,他的API太渣,他是为另一个时代、另一个互联网 3 #创建的,他需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务 4 #发送get请求 5 f=urllib.request.urlopen("http://www.qq.com") 6 result=f.read() 7 print(result) 8 9 #发送携带请求头的GET请求 10 req=urllib.request.Request("http://www.qq.com") 11 req.add_header("QQ","http://www.baidu.com") 12 r=urllib.request.urlopen(req) 13 result=r.read() 14 print(result) 15 16 #Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从 17 # 而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。 18 #get和post的区别 19 #get:获取服务器的信息,而不进行修改;是安全的和幂等的,例如新闻的读取 20 #post:可能改变服务器上的资源;例如对新闻的评论就是用post 21 import requests 22 ret=requests.get("http://www.qq.com") 23 print(ret.url) 24 print(ret.text) 25 26 payload={"key1":"value1","key2":"value2"} 27 ret=requests.get("http://sports.qq.com/nba/",params=payload) 28 print(ret.url) 29 print(ret.text) 30 31 #基本post实例 32 payload={"key1":"value1","key2":"value2"} 33 ret=requests.post("http://sports.qq.com/a/20161027/023124.htm",data=payload) 34 print(ret.text) 35 36 import json 37 url="http://sports.qq.com/a/20161027/023124.htm" 38 payload={"some":"data"} 39 headers={'content-type': 'application/json'} 40 ret=requests.post(url,data=json.dumps(payload),headers=headers) 41 print(ret.text) 42 print(ret.cookies) 43 44 #检测QQ是否在线 45 import urllib 46 import requests 47 from xml.etree import ElementTree as ET 48 r=requests.get("http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=172560199") 49 result=r.text 50 print(result) 51 # #解析xml格式的内容 52 node=ET.XML(result) 53 print(node.text) 54 # #获取内容 55 if node.text=="Y": 56 print("在线") 57 else: 58 print("离线") 59 60 #查看火车停靠信息 61 r=requests.get("http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G651&UserID=") 62 result=r.text 63 print(r.text) 64 # #解析xml格式内容 65 root=ET.XML(result) 66 print(root.text) 67 for node in root.iter("TrainDetailInfo"): 68 print(node.find("TrainStation").text) 69 print("到达时间:",node.find("ArriveTime").text,"发车时间:",node.find("StartTime").text) 70 71 #查询手机号归属地 72 r=requests.get("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=13783417293&UserID=") 73 result=r.text 74 print(result) 75 node=ET.XML(result) 76 print(node.text)
模块十一:logging 用于便捷记录日志且线程安全的模块
1 import logging 2 logging.basicConfig(filename="log.log", 3 format="%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s", 4 datefmt="%Y-%m-%d %H:%M:%S %p", 5 level=10) 6 logging.debug("debug") 7 logging.info("info") 8 logging.warning("warning") 9 logging.error("error") 10 logging.critical("critical") 11 logging.log(10,"log") 12 #上述记录日志的功能,只能讲日志记录在单文件中,如果想要设置多个日志文件,上述方法无法完成,需要自定义文件和日志操作对象 13 #定义文件 14 file_1=logging.FileHandler("l1.log","a",encoding="utf-8") 15 fmt=logging.Formatter(fmt="%(asctime)s-%(name)s-%(levelname)s-%(module)s:%(message)s") 16 file_1.setFormatter(fmt) 17 18 file_2=logging.FileHandler("l2.log","a",encoding="utf-8") 19 fmt=logging.Formatter() 20 file_2.setFormatter(fmt) 21 # 22 # #定义日志 23 logger1=logging.Logger("s1",level=logging.ERROR) 24 logger1.addHandler(file_1) 25 logger1.addHandler(file_2) 26 # 27 # #写日志 28 logger1.critical("2222") 29 30 file_21=logging.FileHandler("l3.log","a",encoding="utf-8") 31 fmt=logging.Formatter() 32 file_21.setFormatter(fmt) 33 34 logger2=logging.Logger("s2",level=logging.INFO) 35 logger2.addHandler(file_21) 36 logger2.critical("6666")
模块十二:shutil 高级的文件、文件夹、压缩包处理模块
1 import shutil 2 #将一个文件的内容拷贝到另一个文件中 3 shutil.copyfileobj(open("new1.xml","r"),open("new3.xml","w")) 4 #拷贝文件 5 shutil.copyfile("new1.xml","new6.xml") 6 7 #压缩 8 # shutil.make_archive("压缩包的文件名或路径","format 保存的格式,zip,gtar等","root_dir:要压缩的文件夹路径", 9 # "owner:用户","group:组","logger:用于记录日志,通常是logging.Logger对象 ") 10 11 #解压缩 shutil对压缩包的处理是调用ZipFile和TarFile两个模块 12 import zipfile 13 #压缩 14 z=zipfile.ZipFile("aa.zip","w") 15 z.write("aa.log") 16 z.write("data.data") 17 z.close() 18 #解压 19 z=zipfile.ZipFile("aa.zip","r") 20 z.extractall() 21 z.close() 22 23 import tarfile 24 25 # 压缩 26 tar = tarfile.open('your.tar','w') 27 tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log') 28 tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log') 29 tar.close() 30 31 # 解压 32 tar = tarfile.open('your.tar','r') 33 tar.extractall() # 可设置解压地址 34 tar.close()