1. time模塊
1.1 time的格式
三種格式:
1. 時(shí)間戳
2. 按照某種格式顯示的時(shí)間
3. 結(jié)構(gòu)化的時(shí)間
時(shí)間戳: 從1970年到代碼執(zhí)行時(shí)間點(diǎn)期間經(jīng)歷過的秒數(shù), 調(diào)用time.time()
import time
print(time.time())
>> 1612284368.302347
格式化顯示時(shí)間: 調(diào)用time.strftime()
import time
print(time.strftime('%Y-%m-%d %H:%M:%S'))
>> 2021-02-03 00:48:35
結(jié)構(gòu)化時(shí)間: 調(diào)用time.localtime()
import time
print(time.localtime()) # time.localtime()顯示當(dāng)前時(shí)間的具體信息
>> time.struct_time(tm_year=2021, tm_mon=2, tm_mday=3, tm_hour=0, tm_min=52, tm_sec=34, tm_wday=2, tm_yday=34, tm_isdst=0)
# 可以賦值給變量, 然后通過變量名.key去獲得value
import time
info = time.localtime()
print(info.tm_year)
>> 2021
print(info.tm_mon)
>> 2
1.2 不同格式的應(yīng)用場(chǎng)景
1. 時(shí)間戳: 用于時(shí)間間隔的計(jì)算
2. 格式化顯示時(shí)間: 按照某種格式展示
3. 結(jié)構(gòu)化時(shí)間: 用于單獨(dú)獲取當(dāng)前時(shí)間的某部分的value
1.3 不同格式之間的轉(zhuǎn)換
1. 結(jié)構(gòu)化時(shí)間 ---time.mktime(結(jié)構(gòu)化時(shí)間)---> 時(shí)間戳格式
import time
print(time.localtime())
>> time.struct_time(tm_year=2021, tm_mon=2, tm_mday=3, tm_hour=1, tm_min=19, tm_sec=47, tm_wday=2, tm_yday=34, tm_isdst=0)
timestamp=time.localtime()
print(time.mktime(timestamp))
>> 1612286387.0
2. 時(shí)間戳 ---time.localtime(時(shí)間戳)---> 結(jié)構(gòu)化時(shí)間
import time
s_time = time.time()
print(s_time)
>> 1612286616.320777
print(time.localtime(s_time))
>> time.struct_time(tm_year=2021, tm_mon=2, tm_mday=3, tm_hour=1, tm_min=23, tm_sec=36, tm_wday=2, tm_yday=34, tm_isdst=0)
3. 結(jié)構(gòu)化時(shí)間 ---time.strftime()---> 格式化字符串時(shí)間
import time
l_time = time.localtime()
print(l_time)
>> time.struct_time(tm_year=2021, tm_mon=2, tm_mday=3, tm_hour=1, tm_min=32, tm_sec=29, tm_wday=2, tm_yday=34, tm_isdst=0)
print(time.strftime('%Y-%m-%d %H:%M:%S',l_time))
>> 2021-02-03 01:32:29
4. 格式化字符串時(shí)間 ---time.strptime()---> 結(jié)構(gòu)化時(shí)間
import time
f_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(f_time)
>> 2021-02-03 01:35:04
s_time = time.strptime(f_time, '%Y-%m-%d %H:%M:%S')
print(s_time)
>> time.struct_time(tm_year=2021, tm_mon=2, tm_mday=3, tm_hour=1, tm_min=35, tm_sec=4, tm_wday=2, tm_yday=34, tm_isdst=-1)
注意: 格式化字符串的時(shí)間格式與時(shí)間戳不能直接轉(zhuǎn)換, 需要通過結(jié)構(gòu)化時(shí)間進(jìn)行轉(zhuǎn)換
案例: 假設(shè)當(dāng)前時(shí)間為'1990-07-10 10:10:10', 如果計(jì)算7天后的時(shí)間
實(shí)現(xiàn)過程: 把格式化時(shí)間 > 轉(zhuǎn)成結(jié)構(gòu)化時(shí)間 > 時(shí)間戳 > 進(jìn)行時(shí)間運(yùn)算 > 轉(zhuǎn)回時(shí)間戳 > 轉(zhuǎn)回格式化時(shí)間
import time
f_time = '1990-07-10 10:10:10'
# 第一步: 格式化字符串時(shí)間, 轉(zhuǎn)成結(jié)構(gòu)化時(shí)間
s_time = time.strptime(f_time,'%Y-%m-%d %H:%M:%S')
print(s_time) # >> time.struct_time(tm_year=1990, tm_mon=7, tm_mday=10, tm_hour=10, tm_min=10, tm_sec=10, tm_wday=1, tm_yday=191, tm_isdst=-1)
# 第二步: 結(jié)構(gòu)化時(shí)間, 轉(zhuǎn)成時(shí)間戳
time_stamp = time.mktime(s_time)
print(time_stamp) # >> 647575810.0
# 第三步: 時(shí)間戳+7天
new_time_stamp = time_stamp + 7 * 86400
print(new_time_stamp) # >> 648180610.0
# 第四步: 將新的時(shí)間戳, 轉(zhuǎn)換成新的結(jié)構(gòu)化格式
new_s_time = time.localtime(new_time_stamp)
print(new_s_time) # >> time.struct_time(tm_year=1990, tm_mon=7, tm_mday=17, tm_hour=10, tm_min=10, tm_sec=10, tm_wday=1, tm_yday=198, tm_isdst=0)
# 第五步: 將新的結(jié)構(gòu)化格式, 轉(zhuǎn)成最終的新的格式化字符串格式
new_f_time = time.strftime('%Y-%m-%d %H:%M:%S',new_s_time)
print(new_f_time) # >> 1990-07-17 10:10:10
# 結(jié)果
# '1990-07-10 10:10:10' ---> '1990-07-17 10:10:10'
1.4 time模塊支持的其他格式
import time
print(time.asctime())
>> Wed Feb 3 02:06:54 2021
2. datetime模塊
2.1 用于獲取當(dāng)前時(shí)間
import datetime
print(datetime.datetime.now())
>> 2021-02-03 01:08:12.385710 # 注意: datatime獲取時(shí)間的結(jié)果是datetime對(duì)象而不是字符串
2.2 進(jìn)行時(shí)間的運(yùn)算(主要的作用)
案例1: 計(jì)算5天后的時(shí)間
import datetime
print(datetime.datetime.now())
>> 2021-02-03 01:10:46.131210
print(datetime.datetime.now()+datetime.timedelta(days=5)) # days=5表示5天后
>> 2021-02-08 01:10:46.131210
案例2: 計(jì)算3天前的時(shí)間
import datetime
print(datetime.datetime.now())
>> 2021-02-03 01:11:56.062510
print(datetime.datetime.now()+datetime.timedelta(days=-3)) # days=-3表示3天前
>> 2021-01-31 01:11:56.062510
注意: datetime進(jìn)行時(shí)間的運(yùn)算不支持年, 沒有此功能, 不過可以用days=365*3(計(jì)算3年后的時(shí)間)來代替
2.3 時(shí)間戳轉(zhuǎn)成格式化字符串格式
好處: 一步到位
缺點(diǎn): 無法指定格式化的格式
import datetime, time
s_time = time.time()
print(s_time) # >> 1612289400.193677
print(datetime.datetime.fromtimestamp(s_time)) # >> 2021-02-03 02:10:00.193677
3. random模塊
取隨機(jī)值
import random
print(random.random()) # 0-1之內(nèi)的小數(shù), 開區(qū)間
>> 0.4848350985621943
print(random.uniform(1,3)) # m,n, 指定范圍內(nèi)的小數(shù), 開區(qū)間
>> 2.4436476444386885
print(random.randint(1,3)) # 閉區(qū)間
>> 3
print(random.randrange(1,3)) # 左閉又開
>> 2
print(random.choice([1,2,[3,4],'a'])) # choice()中放一個(gè)列表, 每次會(huì)從列表中隨機(jī)取出一個(gè)元素
>> 1
print(random.sample([1,2,3,[11,22]],2)) # sample()放一個(gè)列表, 每次按照后面指定的數(shù)字, 從列表中隨機(jī)取出2個(gè)元素, 并且以列表格式返回, 注意, sample()必須指定隨機(jī)取出值的個(gè)數(shù)
>> [3, 2]
list1 = [1,2,3,4,5]
print(random.shuffle(list1)) # random.shuffle()會(huì)將列表順序隨機(jī)打亂, 并且會(huì)修改源列表
print(list1)
>> [2, 5, 3, 1, 4]
案例: 生成隨機(jī)驗(yàn)證碼, 6位大寫字母和數(shù)字的組合
import random
res = '' # 初始化一個(gè)空字符串
for i in range(6): # 6為隨機(jī)字符串, 所以循環(huán)6次, 每次從大寫字母和數(shù)字中隨機(jī)random.choice()取出來一個(gè), 和res做拼接
alpha = chr(random.randint(65,90)) # chr('數(shù)字'), 將對(duì)應(yīng)的數(shù)字按照ASCII表的順序轉(zhuǎn)成字符串, 大寫字母范圍是65-90, 所以random.randint()取出一個(gè)數(shù)字, 然后轉(zhuǎn)成字符串
num = str(random.randint(0,9)) # str(), 將數(shù)字轉(zhuǎn)成字符格式, 因?yàn)樽址荒芎妥址唇? 不能和數(shù)字拼接
alnum = random.choice([alpha,num]) # 得到隨機(jī)的大寫字母和數(shù)字, 加入到random.choice(), 每次隨機(jī)取出一個(gè), 和res拼接
res += alnum
print(res)
4. os模塊
4.1 os.getcwd()
os.getcwd() --> 獲取當(dāng)前工作目錄,即當(dāng)前Python腳本工作的目錄路徑
import os
dir = os.getcwd()
print(dir)
>> C:\Users\David\PycharmProjects\pythonProject\模塊
4.2 os.chdir()
os.chdir() --> 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd
os.chdir(r"C:\Users\David\PycharmProjects\pythonProject\練習(xí)")
print(os.getcwd())
>> C:\Users\David\PycharmProjects\pythonProject\練習(xí)
4.3 os.makedirs('dirname1/dirname2')
os.makedirs('dirname1/dirname2') --> 生成多層遞歸目錄, 支持絕對(duì)路徑和相對(duì)路徑
4.4 os.curdir 和 os.pardir
import os
print(os.curdir) >> . # 返回 '.', 表示當(dāng)前工作目錄
print(os.pardir) >> .. # 返回, '..', 表示上級(jí)工作目錄
4.5 os.removedirs('dir')
os.removedirs('dirname1') --> 若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,則刪除,依此類推
4.6 os.mkdir('dirname')
os.mkdir('dirname') --> 生成單級(jí)目錄;相當(dāng)于shell中mkdir dirname
4.7 os.rmdir('dirname')
os.rmdir('dirname') --> 刪除單級(jí)空目錄,若目錄不為空則無法刪除,報(bào)錯(cuò)
4.8 os.listdir('dirname')
os.listdir('dirname') --> 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
import os
print(os.listdir(r'C:\Users\David\PycharmProjects\pythonProject\s14\模塊'))
>> ['os模塊.py', 'random模塊.py', 'time模塊.py', '__pycache__', '練習(xí).py']
print(os.listdir('.'))
案例: 統(tǒng)計(jì)一個(gè)目錄的大小
1. os.listdir, 列出目標(biāo)目錄的子目錄和文件
2. 從上一步結(jié)果的列表, for循環(huán)取值, 每一進(jìn)行判斷, 取出來的是目錄還是文件, 如果是文件, 直接os.path.getsize()取文件大小, 然后加到sum求和
3. 如果是目錄, 則遞歸執(zhí)行os.listdir
#! /usr/bin/python3
import os
target=os.getcwd()
def get_size(target):
dir = os.listdir(target)
sum_size = 0
for item in dir:
j = '{target}/{item}'.format(target=target,item=item)
if os.path.isfile(j):
res = os.path.getsize(j)
sum_size += res
else:
sum_size += get_size(j)
return sum_size
info = get_size(target)
print(info)
4.9 os.remove()
os.remove() --> 刪除一個(gè)文件
4.10 os.rename("oldname","newname")
os.rename("oldname","newname") --> 重命名文件/目錄
4.11 os.stat('path/filename')
os.stat('path/filename') --> 獲取文件/目錄信息
4.12 os.system("bash command")
os.system("bash command") --> 運(yùn)行shell命令,具體要看Python運(yùn)行在什么平臺(tái)
4.13 os.environ
os.environ --> 獲取系統(tǒng)環(huán)境變量
結(jié)果是字典格式, 并且key和value都是字符串
在整個(gè)程序任何地方都能獲取到的變量
添加變量到environ
import os
env = os.environ
env['username']='admin'
print(env)
>> 'USERNAME': 'admin'
用途: 程序運(yùn)行中, 某個(gè)代碼片段產(chǎn)生了一個(gè)變量, 并且希望這個(gè)變量也能被其他文件中的代碼訪問到, 那么就可以把這個(gè)變量加入到environ中
比如, 一個(gè)用戶登錄, 那么在登錄的運(yùn)行文件中, 可以獲取用戶名字, 這時(shí)如果其他的文件也要調(diào)用這個(gè)用戶名, 那么可以把用戶名添加到系統(tǒng)環(huán)境變量里
4.14 os.path.abspath(path)
os.path.abspath(path) --> 返回path規(guī)范化的絕對(duì)路徑
import os
print(__file__)
>> C:/Users/David/PycharmProjects/pythonProject # Pycharm顯示
print(os.path.abspath(__file__))
>> C:\Users\David\PycharmProjects\pythonProject # Windows規(guī)范
4.15 獲取文件的dirname和basename
import os
print(os.path.dirname(r'a/b/c/d.txt')) >> a/b/c
print(os.path.basename(r'a/b/c/d.txt')) >> d.txt
os.path.split(path)
import os
print(os.path.split(r'a/b/c/d.txt'))
>> ('a/b/c', 'd.txt') # 結(jié)果以元組形式返回
4.16 目錄和文件的判斷
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對(duì)路徑,返回True
os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True。否則返回False
os.path.isdir(path) 如果path是一個(gè)存在的目錄,則返回True。否則返回False
4.17 os.path.join(path1[, path2[, ...]])
os.path.join(path1[, path2[, ...]]) --> 將多個(gè)路徑組合后返回,第一個(gè)絕對(duì)路徑之前的參數(shù)將被忽略
import os
print(os.path.join('a','b','c','d.txt'))
>> a\b\c\d.txt
4.18 os.path.normpath()
os.path.normpath() --> 規(guī)范化路徑
import os
print(os.path.normpath('a/b/c/d/../..'))
>> a\b
獲取一個(gè)路徑的上上級(jí)目錄
import os
print(os.path.dirname(os.path.dirname('a/b/c/d'))) # Python2和Python3通用
>> a/b
4.19 pathlib模塊
Python3.5以后推出的用來處理路徑的模塊
或者父級(jí)目錄
from pathlib import Path
dir = Path(__file__)
par = dir.parent.parent.parent
print(par)
>> C:\Users\David\PycharmProjects\pythonProject
路徑拼接
from pathlib import Path
dir1 = Path('a/b/c')
dir2 = 'd/e.txt'
print(dir1 / dir2)
>> a\b\c\d\e.txt
5 sys模塊
5.1 sys.argv
在程序中接收?qǐng)?zhí)行程序時(shí)傳入的參數(shù), 類似Shell的位置參數(shù)
sys.argv 表示所有參數(shù), 包括程序文件本身, 結(jié)果為一個(gè)列表
C:\Users\David\PycharmProjects\pythonProject\模塊\sys模塊.py
import sys
print(sys.argv)
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])
C:\Users\David\PycharmProjects\pythonProject\模塊>python38 sys模塊.py 1 2 3
['sys模塊.py', '1', '2', '3']
sys模塊.py
1
2
案例: 文件拷貝程序
import sys
src_file = sys.argv[1]
dest_file = sys.argv[2]
# 中間可以通過條件判斷來顯示輸入的源文件和目標(biāo)文件
with open(r'%s'%(src_file), mode = 'bt') as read_f, \
open(r'%s'%(dest_file), mode = 'wb') as write_f:
for line in read_f:
write_f.write(line)
6 打印進(jìn)度條功能
進(jìn)度條格式:
1. 進(jìn)度條寬度固定
2. 隨著進(jìn)度增加, 百分比隨之增加
[##### ] %10
[########### ] %30
原理:
動(dòng)態(tài)的進(jìn)度條實(shí)際都用每一次打印的靜態(tài)效果模擬出來的
用新的進(jìn)度條替換舊的進(jìn)度條, 因?yàn)樗俣确浅?? 所以肉眼是無法識(shí)別的
[# ]
[## ]
[### ]
[#### ]
1. 實(shí)現(xiàn)固定進(jìn)度條
print('[%-50s]'%('#')) # 50表示進(jìn)度條寬度, "-"左對(duì)齊
>> [# ]
2. 實(shí)現(xiàn)百分號(hào)
print('[%-50s] %s%%'%('#',100))
>> [# ] 100%
3. for循環(huán), 實(shí)現(xiàn)每次打印一個(gè)#, 一共打印50次
res = ''
for i in range(50):
res += '#'
print('[%-50s]'%(res))
>>
[# ]
[## ]
[### ]
...
4. 實(shí)現(xiàn)不換行打印
res = ''
for i in range(50):
res += '#'
print('[%-50s]'%(res),end='')
>> [# ][## ]... #此時(shí), 所有的進(jìn)度條都會(huì)在一行打印
5. 實(shí)現(xiàn)每次打印時(shí), 都在行首打印, 替換之前的打印結(jié)果
res = ''
for i in range(50):
res += '#'
print('\r[%-50s]'%(res),end='') # \r表示每次都在行首打印
6. 添加打印時(shí)間間隔, 便于觀看輸出效果
import time
res = ''
for i in range(50):
res += '#'
print('\r[%-50s]'%(res),end='')
time.sleep(0.5)
7. 模擬根據(jù)下載進(jìn)度, 實(shí)現(xiàn)進(jìn)度條打印
import time
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 100000 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(0.5) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
recv_size += 1024 # 模擬每次下載一個(gè)字節(jié)
print(recv_size)
>> # 此時(shí)執(zhí)行會(huì)一次顯示每次下載后的接受數(shù)據(jù)量的大小
1024
2048
3072
4096
5120
...
8. 通過打印進(jìn)度條顯示下載速度
percent = recv_size / total_size # 每打印進(jìn)度條之前, 計(jì)算接收到的數(shù)據(jù)占總數(shù)據(jù)的百分比
hash_num = int(50 * percent) # 定義寬度為50, 那么最多50個(gè)#, 乘百分比得到每次接受完應(yīng)該顯示#的個(gè)數(shù), 然后用int取整, 因?yàn)榘俜种畷?huì)存在小數(shù)
import time
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 100000 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(0.01) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
recv_size += 1024 # 模擬每次下載1024個(gè)字節(jié)
# 打印進(jìn)度條
percent = recv_size / total_size
hash_num = int(50 * percent) * '#' # int()后的結(jié)果是應(yīng)該打印的#的個(gè)數(shù), 再*'#'就會(huì)得到n個(gè)#
print('\r[%-50s]' % (hash_num), end='')
9. 添加百分比顯示
import time
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 100000 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(0.01) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
recv_size += 1024 # 模擬每次下載1024個(gè)字節(jié)
# 打印進(jìn)度條
percent = recv_size / total_size
hash_num = int(50 * percent) * '#'
print('\r[%-50s] %d%%' % (hash_num,int(percent*100)), end='')
10. 每次下載數(shù)量的控制
如果總數(shù)量為1025, 而每次接受1024, 那么第一次下載會(huì)下載1024, recv_size變成1024, while循環(huán)條件判斷后, 會(huì)進(jìn)行下一次下載, 再下載1024個(gè)字節(jié)
這樣recv_size就變成了2048個(gè)字節(jié), 那么第二次計(jì)算百分比就超過了總的數(shù)據(jù)量, 變成199%.
因此, 需要控制每次下載的數(shù)量, 防止超出總的范圍
方法1: 每次計(jì)算中百分比后, 對(duì)百分之進(jìn)行判斷, 如果大于1, 那么強(qiáng)項(xiàng)轉(zhuǎn)換成1, 這樣最后一次無論接受了多少數(shù)據(jù), 最后進(jìn)度條輸出的都是100%
方法2: 每次進(jìn)入while循環(huán)后, 再判斷一次total_size和recv_size的差值, 如果差值小于1024, 那么recv_size就+=差值, 如果大于1024, 那么還是+=1024
方法1:
import time
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 1025 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(1) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
recv_size += 1024 # 模擬每次下載1024個(gè)字節(jié)
# 打印進(jìn)度條
percent = recv_size / total_size
if percent > 1:
percent = 1
hash_num = int(50 * percent) * '#'
print('\r[%-50s] %d%%' % (hash_num,int(percent*100)), end='')
方法2:
import time
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 1025 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(1) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
diff_size = total_size - recv_size
if diff_size < 1024:
recv_size += diff_size
else:
recv_size += 1024 # 模擬每次下載1024個(gè)字節(jié)
# 打印進(jìn)度條
percent = recv_size / total_size
hash_num = int(50 * percent) * '#'
print('\r[%-50s] %d%%' % (hash_num,int(percent*100)), end='')
11. 將打印進(jìn)度條做成功能
import time
def progress(percent):
hash_num = int(50 * percent) * '#'
print('\r[%-50s] %d%%' % (hash_num, int(percent * 100)), end='')
recv_size = 0 # 初始化接受的數(shù)據(jù)
total_size = 102500 # 數(shù)據(jù)總大小
while recv_size < total_size:
time.sleep(0.05) # 添加時(shí)間間隔, 每0.5秒下載1024字節(jié), 類似模擬下載速度
diff_size = total_size - recv_size
if diff_size < 1024:
recv_size += diff_size
else:
recv_size += 1024 # 模擬每次下載1024個(gè)字節(jié)
# 打印進(jìn)度條
percent = recv_size / total_size
progress(percent)
7 shutil模塊
用于文件處理
- 將文件內(nèi)容拷貝到另一個(gè)文件中
import shutil
shutil.copyfileobj(open('random模塊.py', 'r'), open('random模塊.bak.py', 'w'))
- 拷貝文件
shutil.copyfile('f1.log', 'f2.log') # 目標(biāo)文件會(huì)自動(dòng)創(chuàng)建
- 只把源文件的權(quán)限拷貝給目標(biāo)文件, 目標(biāo)文件的內(nèi)容, 屬主, 屬組不變
shutil.copymode('f1.log', 'f2.log') #目標(biāo)文件必須存在
- 只把源文件的狀態(tài)信息拷貝給目標(biāo)文件, 包括: mode bits, atime, mtime, flags
shutil.copystat('f1.log', 'f2.log') #目標(biāo)文件必須存在
- 拷貝文件和權(quán)限
shutil.copy('f1.log', 'f2.log')
- 拷貝文件和狀態(tài)信息
shutil.copy2('f1.log', 'f2.log')
- 打包, 解包, 壓縮, 解壓縮
將 /data/下的文件打包并壓縮到當(dāng)前程序文件運(yùn)行的目錄
# root_dir表示要打包的路徑
import shutil
shutil.make_archive("data.bak","gztar",root_dir="/data")
解包解壓縮
t=tarfile.open('/tmp/data.tar','r')
t.extractall('/opt')
t.close()