Добавление папок к zip-файлу с помощью Python

Если вы хотите использовать механизмы кэширования, например Redis или Memcached , возможно, выбор DALMP может быть выбран. Он использует чистый MySQLi . Проверьте это: Уровень абстракции базы данных DALMP для MySQL с использованием PHP.

Кроме того, вы можете «подготовить» свои аргументы перед подготовкой своего запроса, чтобы вы могли создавать динамические запросы и в конце имеют полностью подготовленный запрос. Уровень абстракции базы данных DALMP для MySQL с использованием PHP.

45
задан Community 23 May 2017 в 12:17
поделиться

9 ответов

Хорошо, после того, как я понял то, что Вы хотите, это столь же просто как использование второго аргумента zipfile.write, где можно использовать то, что Вы хотите:

import zipfile
myZipFile = zipfile.ZipFile("zip.zip", "w" )
myZipFile.write("test.py", "dir\\test.py", zipfile.ZIP_DEFLATED )

создает zipfile, где test.py был бы извлечен к каталогу, названному dir

РЕДАКТИРОВАНИЕ: Я когда-то должен был создать пустой каталог в zip-файле: это возможно. после кода выше просто удаляют файл test.py из zipfile, файла не стало, но пустой каталог остается.

48
ответ дан RSabet 26 November 2019 в 20:53
поделиться

после добавления некоторого импорта Ваш код хорошо работает для меня, как Вы называете сценарий, возможно, Вы могли сказать нам структуру папок '..\packed\bin' каталог.

я назвал Ваш код со следующими аргументами:

planName='test.zip'
files=['z.py',]
folders=['c:\\temp']
(success,filename)=createZipFile(planName,files,folders)

'

2
ответ дан RSabet 26 November 2019 в 20:53
поделиться

Heres отредактированный код я работал. На основе кода выше, взятый из списка рассылки. Я добавил импорт и сделал основную стандартную программу. Я также отключил игру с выходным именем файла для создания кода короче.

#!/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-файле. Просто требуемый для регистрации кода я на самом деле работал, не код, которого я основывал свой код.

0
ответ дан Mizipzor 26 November 2019 в 20:53
поделиться
import zipfile
import os


class ZipUtilities:

    def toZip(self, file, filename):
        zip_file = zipfile.ZipFile(filename, 'w')
        if os.path.isfile(file):
                    zip_file.write(file)
            else:
                    self.addFolderToZip(zip_file, file)
        zip_file.close()

    def addFolderToZip(self, zip_file, folder): 
        for file in os.listdir(folder):
            full_path = os.path.join(folder, file)
            if os.path.isfile(full_path):
                print 'File added: ' + str(full_path)
                zip_file.write(full_path)
            elif os.path.isdir(full_path):
                print 'Entering folder: ' + str(full_path)
                self.addFolderToZip(zip_file, full_path)

def main():
    utilities = ZipUtilities()
    filename = 'TEMP.zip'
    directory = 'TEMP'
    utilities.toZip(directory, filename)

main()

я работаю:

python tozip.py

Это - журнал:

havok@fireshield:~$ python tozip.py

File added: TEMP/NARF (7ª copia)
Entering folder: TEMP/TEMP2
File added: TEMP/TEMP2/NERF (otra copia)
File added: TEMP/TEMP2/NERF (copia)
File added: TEMP/TEMP2/NARF
File added: TEMP/TEMP2/NARF (copia)
File added: TEMP/TEMP2/NARF (otra copia)
Entering folder: TEMP/TEMP2/TEMP3
File added: TEMP/TEMP2/TEMP3/DOCUMENTO DEL FINAL
File added: TEMP/TEMP2/TEMP3/DOCUMENTO DEL FINAL (copia)
File added: TEMP/TEMP2/NERF
File added: TEMP/NARF (copia) (otra copia)
File added: TEMP/NARF (copia) (copia)
File added: TEMP/NARF (6ª copia)
File added: TEMP/NERF (copia) (otra copia)
File added: TEMP/NERF (4ª copia)
File added: TEMP/NERF (otra copia)
File added: TEMP/NERF (3ª copia)
File added: TEMP/NERF (6ª copia)
File added: TEMP/NERF (copia)
File added: TEMP/NERF (5ª copia)
File added: TEMP/NARF (8ª copia)
File added: TEMP/NARF (3ª copia)
File added: TEMP/NARF (5ª copia)
File added: TEMP/NERF (copia) (3ª copia)
File added: TEMP/NARF
File added: TEMP/NERF (copia) (copia)
File added: TEMP/NERF (8ª copia)
File added: TEMP/NERF (7ª copia)
File added: TEMP/NARF (copia)
File added: TEMP/NARF (otra copia)
File added: TEMP/NARF (4ª copia)
File added: TEMP/NERF
File added: TEMP/NARF (copia) (3ª copia)

, Как Вы видите, это работает, архив в порядке также. Это - рекурсивная функция, которая может архивировать всю папку. Единственная проблема состоит в том, что это не создает пустую папку.

Аплодисменты.

8
ответ дан Community 26 November 2019 в 20:53
поделиться

Zip-файл не имеет никакой структуры каталогов, он просто имеет набор путей и их содержания. Эти пути должны быть относительно мнимой корневой папки (сам zip-файл). ".. /" префиксы не имеют никакого определенного значения в zip-файле.

Полагают, что у Вас есть файл, a, и Вы хотите сохранить его в "папке" в zip-файле. Все, что необходимо сделать, является префиксом имя файла с именем папки, храня файл в zipfile:

zipi= zipfile.ZipInfo()
zipi.filename= "folder/a" # this is what you want
zipi.date_time= time.localtime(os.path.getmtime("a"))[:6]
zipi.compress_type= zipfile.ZIP_DEFLATED
filedata= open("a", "rb").read()

zipfile1.writestr(zipi, filedata) # zipfile1 is a zipfile.ZipFile instance

я не знаю ни о каких реализациях ZIP, позволяющих включение пустой папка в zip-файле. Я могу думать об обходном решении (хранящий макет имя файла в zip "папка", которая должна быть проигнорирована на извлечении), но не портативный через реализации.

14
ответ дан tzot 26 November 2019 в 20:53
поделиться

Когда Вы хотите создать пустую папку, можно сделать это как это:

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

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

-2
ответ дан 26 November 2019 в 20:53
поделиться

Ниже приведен код для архивирования всего каталога в zip-файл.

Кажется, это работает нормально, создавая zip-файлы как в Windows, так и в Linux. Выход файлы, кажется, извлекаются правильно в Windows (встроенная функция сжатых папок, WinZip и 7-Zip) и Linux. Однако в zip-файле появляются пустые каталоги быть сложной проблемой. Решение ниже, кажется, работает, но вывод "zipinfo" на linux касается. Также права доступа к каталогу не установлены правильно для пустых каталогов в zip-архиве. Это требует некоторые более глубокие исследования.

Я получил некоторую информацию из этой нити скоростной проверки и этой нити списка рассылки python .

Обратите внимание, что эта функция предназначена для помещения файлов в почтовый архив с либо нет родительского каталога или только один родительский каталог, поэтому он будет обрезать любой ведущие каталоги в путях файловой системы и не включать их в пути к zip-архивам. Это обычно тот случай, когда вы хотите просто взять каталог и превратить его в ZIP-файл, который можно извлечь в разные местах.

Аргументы ключевого слова:

dirPath - строковый путь к каталогу для архивирования. Это единственный обязательный аргумент. Может быть абсолютным или относительным, но только один или ноль ведущие каталоги будут включены в zip-архив.

zipFilePath - строковый путь к выходному zip-файлу. Это может быть абсолютным или относительный путь. Если zip-файл уже существует, он будет обновлен. Если нет, он будет создан. Если вы хотите заменить его с нуля, удалите его до вызова этой функции. (по умолчанию вычисляется как dirPath + ".zip")

includeDirInZip - логическое значение, указывающее, должен ли каталог верхнего уровня быть включены в архив или опущены. (по умолчанию True)

(обратите внимание, что StackOverflow, похоже, не в состоянии распечатать мой python с строки в тройных кавычках, поэтому я просто преобразовал свои строки документа в текст сообщения)

#!/usr/bin/python
import os
import zipfile

def zipdir(dirPath=None, zipFilePath=None, includeDirInZip=True):

    if not zipFilePath:
        zipFilePath = dirPath + ".zip"
    if not os.path.isdir(dirPath):
        raise OSError("dirPath argument must point to a directory. "
            "'%s' does not." % dirPath)
    parentDir, dirToZip = os.path.split(dirPath)
    #Little nested function to prepare the proper archive path
    def trimPath(path):
        archivePath = path.replace(parentDir, "", 1)
        if parentDir:
            archivePath = archivePath.replace(os.path.sep, "", 1)
        if not includeDirInZip:
            archivePath = archivePath.replace(dirToZip + os.path.sep, "", 1)
        return os.path.normcase(archivePath)

    outFile = zipfile.ZipFile(zipFilePath, "w",
        compression=zipfile.ZIP_DEFLATED)
    for (archiveDirPath, dirNames, fileNames) in os.walk(dirPath):
        for fileName in fileNames:
            filePath = os.path.join(archiveDirPath, fileName)
            outFile.write(filePath, trimPath(filePath))
        #Make sure we get empty directories as well
        if not fileNames and not dirNames:
            zipInfo = zipfile.ZipInfo(trimPath(archiveDirPath) + "/")
            #some web sites suggest doing
            #zipInfo.external_attr = 16
            #or
            #zipInfo.external_attr = 48
            #Here to allow for inserting an empty directory.  Still TBD/TODO.
            outFile.writestr(zipInfo, "")
    outFile.close()

Вот несколько примеров использования. Обратите внимание, что если ваш аргумент dirPath имеет несколько ведущих каталогов, по умолчанию будет включен только последний. Передайте includeDirInZip = False, чтобы пропустить все ведущие каталоги.

zipdir("foo") #Just give it a dir and get a .zip file
zipdir("foo", "foo2.zip") #Get a .zip file with a specific file name
zipdir("foo", "foo3nodir.zip", False) #Omit the top level directory
zipdir("../test1/foo", "foo4nopardirs.zip")
4
ответ дан 26 November 2019 в 20:53
поделиться

вот моя функция, которую я использую для архивирования папки:

import os
import os.path
import zipfile

def zip_dir(dirpath, zippath):
    fzip = zipfile.ZipFile(zippath, 'w', zipfile.ZIP_DEFLATED)
    basedir = os.path.dirname(dirpath) + '/' 
    for root, dirs, files in os.walk(dirpath):
        if os.path.basename(root)[0] == '.':
            continue #skip hidden directories        
        dirname = root.replace(basedir, '')
        for f in files:
            if f[-1] == '~' or (f[0] == '.' and f != '.htaccess'):
                #skip backup files and all hidden files except .htaccess
                continue
            fzip.write(root + '/' + f, dirname + '/' + f)
    fzip.close()
3
ответ дан 26 November 2019 в 20:53
поделиться

Thank you wery much for this useful function! I found it very useful as I was also searching for help. However, maybe it would be useful to change it a little bit so that

basedir = os.path.dirname(dirpath) + '/'

would be

basedir = os.path.dirname(dirpath + '/')

Because found that if I want to zip folder 'Example' which is located at 'C:\folder\path\notWanted\to\zip\Example',

I got in Windows:

dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example/'
dirname = 'C:\folder\path\notWanted\to\zip\Example\Example\Subfolder_etc'

But I suppose your code should give

dirpath = 'C:\folder\path\notWanted\to\zip\Example'
basedir = 'C:\folder\path\notWanted\to\zip\Example\'
dirname = '\Subfolder_etc'
0
ответ дан 26 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: