如何使用 zipfile python 压缩文件夹

Posted

技术标签:

【中文标题】如何使用 zipfile python 压缩文件夹【英文标题】:How to compress folders using zipfile python 【发布时间】:2020-01-27 14:57:35 【问题描述】:

所以到目前为止,我的程序能够成功添加和压缩与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")

编辑

假设 location 有更多的子文件夹如何压缩其中的文件?

【问题讨论】:

你有代码,做一个备份,这样你就可以恢复,然后尝试运行它。 是的,我做到了.. 谢谢!而且它仍然没有给我locations 子文件夹或其内容整天都在尝试:S 【参考方案1】:

上市[Python 3.Docs]: zipfile - Work with ZIP archives。

您的代码中的(主要)问题是您将 continue 误认为是 break。这样,当遇到 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:dbit 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\***\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\***\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\***\q059933596>dir *.zip
 Volume in drive E is SSD0-WORK
 Volume Serial Number is AE9E-72AC

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

20/01/27  20:13               547 archive.zip
               1 File(s)            547 bytes
               0 Dir(s)  113,094,475,776 bytes free

【讨论】:

非常感谢您,这非常有效...我想您只是为我节省了 2-3 天 :D 非常感谢您的帮助 :)【参考方案2】:

您需要将 location 中的每个文件单独添加到 zip1。 将此添加到相应的if-branch:

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

【讨论】:

如果位置中还有文件夹,您能否将其更新为?让它是动态的? 另外我不想压缩文件夹的内容,而是压缩文件夹本身......所以当说压缩像库这样的东西时,它不会破坏文件组织结构...... 1) 我今天可能无法解决这个问题,抱歉。自己尝试并更新您的问题或在遇到问题时提出新问题。 2)它不应该破坏结构。至少对我来说不是。 更新问题【参考方案3】:

您无法将目录添加到 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')

注意,以上代码改编自thisMark Byers的回答。

【讨论】:

以上是关于如何使用 zipfile python 压缩文件夹的主要内容,如果未能解决你的问题,请参考以下文章

不支持 Python Zipfile 压缩方法

Python实现批量压缩文件/文件夹——zipfile

python zipfile 文件压缩和文件

Python实现批量压缩文件/文件夹——zipfile

python zipfile解压缩

python怎样压缩和解压缩ZIP文件