Как сжать папки с помощью zipfile python - PullRequest
1 голос
/ 27 января 2020

Таким образом, моя программа до сих пор успешно может добавлять и сжимать файлы, которые находятся в том же каталоге, что и test.py, но в этом же каталоге также есть папка с именем location, в которой содержатся дополнительные файлы, например citynames.txt Что случается, когда я делаю простой zip.write (logi c используемый в else блоке) location добавляется в zip-файл, однако его пустое значение, то есть по какой-то причине внутри него нет citynames.txt, пожалуйста помогите как-нибудь добавить саму папку?

import os
import zipfile
import shutil
dir_path = os.path.dirname(os.path.realpath(__file__))  #holds the directory where script is located
os.chdir(dir_path)                                      #Changes to directory where script is located
fp=os.listdir(dir_path)                                 #file pointer

directory_size=len(os.listdir(dir_path))

zip1=zipfile.ZipFile('Archive.zip','w')

for i in range(directory_size) :
   if fp[i]=='test.py':
      break
   if fp[i]=='location':
      #Some code needs to be added here to write all the contents of folder "location" into 
       "Archive.zip"

   else:
       zip1.write(fp[i],compress_type=zipfile.ZIP_DEFLATED)

print("Process completed")

РЕДАКТИРОВАТЬ

Предполагая, что у местоположения есть дополнительные подпапки, как архивировать файлы внутри них, а также?

Ответы [ 3 ]

1 голос
/ 27 января 2020

Причина, по которой вы не можете добавить каталог в zip-архив, заключается в том, что zip1.write не является рекурсивным (он не будет добавлять файлы, расположенные ниже по дереву каталогов, только то, что вы явно указали для добавления) , Вам нужно будет использовать os.walk - go во всех подкаталогах и добавлять каждый файл отдельно:

import os
import zipfile


def zipdir(dir_to_archive, archive_filename):
    ziph = zipfile.ZipFile(archive_filename, 'w', zipfile.ZIP_DEFLATED)
    for root, dirs, files in os.walk(dir_to_archive):
        for file in files:
            if file != archive_filename:
                ziph.write(os.path.join(root, file))
    ziph.close()


os.chdir(dir_path)
zipdir(dir_path, 'Archive.zip')

Обратите внимание, приведенный выше код был адаптирован с этого ответа Марк Байерс .

1 голос
/ 27 января 2020

Листинг [Python 3.Docs]: zipfile - Работа с ZIP-архивами .

(Основная) проблема в вашем коде заключается в том, что вы ошибаетесь продолжить по перерыв . Таким образом, когда встречается test.py , все элементы после него будут игнорироваться, так как break выходит из l oop.

Вот вариант, который возвращается в подкаталоги с помощью [Python 3.Docs]: glob. iglob ( pathname, *, recursive = False ) и добавляет файлы в архив.

code00.py :

#!/usr/bin/env python

import sys
import os
import glob
import zipfile


def main(*argv):
    archive_name = "archive.zip"
    dir_path = os.path.dirname(os.path.realpath(__file__))
    dir_path_len = len(dir_path) + len(os.path.sep)
    with zipfile.ZipFile(archive_name, mode="w", compression=zipfile.ZIP_DEFLATED) as zf:
        for file_name in glob.iglob(os.path.join(dir_path, "**"), recursive=True):
            if os.path.isdir(file_name):
                continue
            member_name = file_name[dir_path_len:]
            if member_name in [
                os.path.basename(__file__),
                archive_name,
            ]:
                continue
            print(member_name)
            zf.write(file_name, member_name)


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main(*sys.argv[1:])
    print("\nDone.")

Выход :

e:\Work\Dev\StackOverflow\q059933596>tree /f /a
Folder PATH listing for volume SSD0-WORK
Volume serial number is AE9E-72AC
E:.
|   code00.py
|   file0.txt
|
\---locations
    |   location0.tzt
    |   location1.txt
    |
    \---subdir0
            subdir0file0.txt


e:\Work\Dev\StackOverflow\q059933596>"e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32

file0.txt
locations\location0.tzt
locations\location1.txt
locations\subdir0\subdir0file0.txt

Done.

e:\Work\Dev\StackOverflow\q059933596>dir *.zip
 Volume in drive E is SSD0-WORK
 Volume Serial Number is AE9E-72AC

 Directory of e:\Work\Dev\StackOverflow\q059933596

20/01/27  20:13               547 archive.zip
               1 File(s)            547 bytes
               0 Dir(s)  113,094,475,776 bytes free
1 голос
/ 27 января 2020

Вам необходимо добавить каждый файл в местоположение самостоятельно в zip1.
Добавить это в соответствующую if -ветку:

for f in os.listdir("location"):
    zip1.write("location/"+f, compress_type=zipfile.ZIP_DEFLATED)
...