Добавление папок в zip-файл с помощью python - PullRequest
42 голосов
/ 19 января 2009

Я хочу создать zip-файл. Добавьте папку в zip-файл, а затем добавьте в нее несколько файлов.

Итак, я хочу получить zip-файл с одной папкой с файлами.

Я не знаю, плохо ли иметь папки в zip-файлах или что-то в этом роде, но Google ничего мне не дает по этому вопросу.

Я начал с этого:

def addFolderToZip(myZipFile,folder):
    folder = folder.encode('ascii') #convert path to ascii for ZipFile Method
    for file in glob.glob(folder+"/*"):
            if os.path.isfile(file):
                print file
                myZipFile.write(file, os.path.basename(file), zipfile.ZIP_DEFLATED)
            elif os.path.isdir(file):
                addFolderToZip(myZipFile,file)

def createZipFile(filename,files,folders):
    curTime=strftime("__%Y_%m_%d", time.localtime())
    filename=filename+curTime;
    print filename
    zipFilename=utils.getFileName("files", filename+".zip")
    myZipFile = zipfile.ZipFile( zipFilename, "w" ) # Open the zip file for writing 
    for file in files:
        file = file.encode('ascii') #convert path to ascii for ZipFile Method
        if os.path.isfile(file):
            (filepath, filename) = os.path.split(file)
            myZipFile.write( file, filename, zipfile.ZIP_DEFLATED )

    for folder in  folders:   
        addFolderToZip(myZipFile,folder)  
    myZipFile.close()
    return (1,zipFilename)


(success,filename)=createZipFile(planName,files,folders);

Взято из: http://mail.python.org/pipermail/python-list/2006-August/396166.html

Который избавляется от всех папок и помещает все файлы в целевой папке (и ее подпапках) в один zip-файл. Мне не удалось добавить целую папку.

Если я передаю путь к папке в myZipFile.write, я получаю

IOError: [Errno 13] В доступе отказано: '.. \ pack \ bin'

Любая помощь приветствуется.

Смежный вопрос: Как мне сжать содержимое папки с помощью python (версия 2.5)?

Ответы [ 12 ]

0 голосов
/ 24 марта 2009

Когда вы хотите создать пустую папку, вы можете сделать это следующим образом:

    storage = api.Storage.open("empty_folder.zip","w")
    res = storage.open_resource("hannu//","w")
    storage.close()

Папка не показана в winextractor, но когда вы извлекаете ее, она показывается.

0 голосов
/ 20 января 2009

Вот отредактированный код, который я запустил. Это основано на коде выше, взятом из списка рассылки. Я добавил импорт и сделал основной режим. Я также обрезал путаницу с выходным именем файла, чтобы сделать код короче.

#!/usr/bin/env python

import os, zipfile, glob, sys

def addFolderToZip(myZipFile,folder):
    folder = folder.encode('ascii') #convert path to ascii for ZipFile Method
    for file in glob.glob(folder+"/*"):
            if os.path.isfile(file):
                print file
                myZipFile.write(file, os.path.basename(file), zipfile.ZIP_DEFLATED)
            elif os.path.isdir(file):
                addFolderToZip(myZipFile,file)

def createZipFile(filename,files,folders):
    myZipFile = zipfile.ZipFile( filename, "w" ) # Open the zip file for writing 
    for file in files:
        file = file.encode('ascii') #convert path to ascii for ZipFile Method
        if os.path.isfile(file):
            (filepath, filename) = os.path.split(file)
            myZipFile.write( file, filename, zipfile.ZIP_DEFLATED )

    for folder in  folders:   
        addFolderToZip(myZipFile,folder)  
    myZipFile.close()
    return (1,filename)

if __name__=="__main__":
    #put everything in sys.argv[1] in out.zip, skip files
    print createZipFile("out.zip", [], sys.argv[1])

На работе, на моем компьютере с Windows, этот код работал нормально, но не создавал никаких «папок» в zipfile. По крайней мере, я помню, что сделал. Теперь дома, на моем Linux-компьютере, созданный zip-файл кажется плохим:

$ unzip -l out.zip 
Archive:  out.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of out.zip or
        out.zip.zip, and cannot find out.zip.ZIP, period.

Я не знаю, случайно ли я нарушил код, я думаю, что это то же самое. Проблемы с кроссплатформенностью? В любом случае, это не связано с моим первоначальным вопросом; получение папок в zip-файле. Просто хотел опубликовать код, который я на самом деле выполнял, а не код, на котором я основывал свой код.

...