2012-11-19 36 views
0

在我開始之前,我正在嘗試創建一個python zip腳本,它將拍攝target_dir的快照,將其壓縮,並將其保存在臨時文件夾中,併爲其指定「now」變量的文件名。這是我的代碼有:構建變量到python zip腳本

#!/usr/bin/env python 

import os 
import sys 
import datetime 

now = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M") 
target_dir = '/var/lib/data' 
temp_dir='/tmp' 

zip = zipfile.ZipFile('/tmp/example.zip', 'w', zipfile.ZIP_DEFLATED) 
rootlen = len(target_dir) + 1 
for base, dirs, files in os.walk(target_dir): 
    for file in files: 
     fn = os.path.join(base, file) 
     zip.write(fn, fn[rootlen:]) 

我無法弄清楚如何讓這條線,而不是使用變量「現在」和「TEMP_DIR」而不是硬編碼的目的:

zip = zipfile.ZipFile('/tmp/example.zip', 'w', zipfile.ZIP_DEFLATED) 

我想我想要這樣的東西(僞代碼):

zip = zipfile.ZipFile('<temp_dir>/<now>.zip', 'w', zipfile.ZIP_DEFLATED) 

任何人都可以告訴我應該怎麼做?

回答

1

Python字符串格式化可以讓你把變量的內容轉換爲字符串,這將是

zip = zipfile.ZipFile('%s/%s.zip' % (temp_dir, now), 'w', zipfile.ZIP_DEFLATED) 

字符串格式化代替「%S」的出現次數與在格式化操作後%元組的字符串。

備選地(和清潔器),使用在後面的代碼使用相同os.path.join

zip = zipfile.ZipFile(os.path.join(temp_dir, now+".zip"), 'w', zipfile.ZIP_DEFLATED) 

os.path.join是膠合的文件系統路徑的元件一起根據任何邏輯功能的文件系統使用,所以它會在使用路徑中的該字符的操作系統中使用\而不是/。字符串連接只是+,所以要將.zip結尾的文件粘貼到另一個字符串now,now+".zip"只是訣竅。

+0

是否這樣? https://gist.github.com/4114519 – Jimmy

+0

好的,所以編輯後我現在有這個:https://gist.github.com/4114519 – Jimmy

+0

看起來應該可以工作。 – Anaphory

2

總之,os.path.join(temp_dir, now + '.zip'),但我不確定這是否真的是你問的。因爲我不確定你是如何得到儘可能多的,並且陷在這裏。

+0

我一直在試圖建立在其他國家人民的示例代碼,所以我不能要求極本,我想使它成爲工作的我應用。 – Jimmy

+0

我試圖實現你的代碼,你可以請看看我是否做得正確嗎? https://gist.github.com/4114493 – Jimmy

+0

不,你有函數調用周圍的引號。 – Anaphory

0

您還可以使用內shutil更高級別的功能:

>>> import shutil 
>>> from time import strftime 
>>> now = strftime("%Y-%m-%d_%H-%M") 
>>> shutil.make_archive('/tmp/file_%s' % now, 'zip', '/usr/games/') 
'/tmp/file_2012-11-19_22-43.zip'