2008-11-17 1 views
27

Как только у меня есть все файлы, которые мне нужны в определенной папке, я бы хотел, чтобы мой скрипт python застегивал содержимое папки.Как поместить содержимое папки с помощью python (версия 2.5)?

Возможно ли это?

И как я мог это сделать?

+0

ответ, для современного Python, [здесь] (http://stackoverflow.com/q/1855095/541136) – 2017-03-14 19:08:00

ответ

31

Адаптированная версия the script является:

#!/usr/bin/env python 
from __future__ import with_statement 
from contextlib import closing 
from zipfile import ZipFile, ZIP_DEFLATED 
import os 

def zipdir(basedir, archivename): 
    assert os.path.isdir(basedir) 
    with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z: 
     for root, dirs, files in os.walk(basedir): 
      #NOTE: ignore empty directories 
      for fn in files: 
       absfn = os.path.join(root, fn) 
       zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path 
       z.write(absfn, zfn) 

if __name__ == '__main__': 
    import sys 
    basedir = sys.argv[1] 
    archivename = sys.argv[2] 
    zipdir(basedir, archivename) 

Пример:

C:\zipdir> python -mzipdir c:\tmp\test test.zip 

Это создает 'C:\zipdir\test.zip' архив с содержимым каталога 'c:\tmp\test'.

+0

`ZFN = absfn [Len (имя_базовой_папки) + Len (os.sep):] `почему не` absbasedir = os.path.abspath (basedir); os.path.relpath (absfn, absbasedir) `? Кроме того, lengthi и os.sep можно рассматривать как константу, поэтому она должна находиться за пределами двух циклов. – n611x007 2013-08-16 13:11:49

5

Вот рекурсивную версию

def zipfolder(path, relname, archive): 
    paths = os.listdir(path) 
    for p in paths: 
     p1 = os.path.join(path, p) 
     p2 = os.path.join(relname, p) 
     if os.path.isdir(p1): 
      zipfolder(p1, p2, archive) 
     else: 
      archive.write(p1, p2) 

def create_zip(path, relname, archname): 
    archive = zipfile.ZipFile(archname, "w", zipfile.ZIP_DEFLATED) 
    if os.path.isdir(path): 
     zipfolder(path, relname, archive) 
    else: 
     archive.write(path, relname) 
    archive.close()