如何压缩文件夹的内容而不是文件夹[重复]

Posted

技术标签:

【中文标题】如何压缩文件夹的内容而不是文件夹[重复]【英文标题】:How to zip contents of but not the folder [duplicate] 【发布时间】:2020-07-21 02:06:24 【问题描述】:

我正在使用以下文件夹结构:

.
+-- temp
|   +-- sample1.csv
|   +-- sample2.csv
+-- zips
|   +-- zip1.zip
|   +-- zip2.zip
+-- main.py

我想将temp 文件夹的内容压缩成一个压缩文件,但我不想包含该文件夹。我尝试了以下方法(希望只压缩文件):

import pathlib
import zipfile

origin = pathlib.Path('.') / 'temp'
destination = pathlib.Path('.') / 'zips' / 'zip3.zip'

with zipfile.ZipFile(destination, mode='w') as zipfile_:
    for content in origin.iterdir():
        zipfile_.write(content)

我也尝试使用shutil.make_archive(),但它呈现相同的结果,唯一的区别是该目录被简单地命名为"."


编辑:感谢CookieReaver 和metatoaster(我相信)指出ZipFile.write() 方法有一个名为arcname 的参数,它将命名文件(ZipFile.write() documentation)。

这是我应用修复后的原始问题:

import pathlib
import zipfile

origin = pathlib.Path('.') / 'temp'
destination = pathlib.Path('.') / 'zips' / 'zip3.zip'

with zipfile.ZipFile(destination, mode='w') as zipfile_:
    for content in origin.iterdir():
        zipfile_.write(content, content.name)

【问题讨论】:

【参考方案1】:
import zipfile
import os

orig = r"path_to_origin_dir"
dest = r"path_to_destination_dir"

zip_name = "zip3.zip"
target_zip = zipfile.ZipFile(os.path.join(dest, zip_name), 'w')

for dp, dn, fn in os.walk(orig):

    for filename in fn:
        if filename.endswith('csv'):
            target_zip.write(os.path.join(dp, filename), os.path.relpath(os.path.join(dp, filename), orig))

target_zip.close()

这就是你的目标吗?

【讨论】:

以上是关于如何压缩文件夹的内容而不是文件夹[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取最新的 JRE / JDK 作为 zip 文件而不是 EXE 或 MSI 安装程序? [关闭]

如何检查zip文件是不是包含所有图像文件而不在服务器上解压缩

如何将目录的所有内容(不包括父目录)移动到另一个目录 Groovy [重复]

如何在Linux上使用tar命令解压和压缩文件

Python 压缩一个子文件夹而不是整个文件夹路径

如何破解压缩文件密码,小编教你如何破解带有密码的压缩包