如何使用zipfile python压缩文件夹

2024-06-02 04:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,到目前为止,我的程序能够成功地添加和压缩与test.py位于同一目录中的文件,但在同一目录中还有一个名为location的文件夹,其中包含其他文件,比如citynames.txt当我执行简单的zip.write(在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")

编辑

假设位置有更多的子文件夹,那么如何压缩其中的文件呢


Tags: 文件topathpytestimport文件夹os
3条回答

您需要将位置中的每个文件单独添加到zip1
将其添加到相应的if-分支:

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

无法将目录添加到zip存档的原因是zip1.write不是递归的(它不会添加目录树下较远的文件,只添加您明确要求它添加的文件)。您需要使用os.walk遍历所有子目录并分别添加每个文件:

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')

注意,上面的代码是由Mark Byers根据this答案改编的

清单[Python 3.Docs]: zipfile - Work with ZIP archives

代码中的(主要)问题是您将继续误认为是中断。这样,当遇到test.py时,它后面的所有项目都将被忽略,因为break退出循环

这里有一个变量,它使用[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

相关问题 更多 >