2012-11-19 33 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'