python / zip:如果提供文件的绝对路径,如何消除zip存档中的绝对路径?

时间:2013-04-18 19:54:28

标签: python zip absolute-path zipfile

我在两个不同的目录中有两个文件,一个是'/home/test/first/first.pdf',另一个是'/home/text/second/second.pdf'。我使用以下代码来压缩它们:

import zipfile, StringIO
buffer = StringIO.StringIO()
first_path = '/home/test/first/first.pdf'
second_path = '/home/text/second/second.pdf'
zip = zipfile.ZipFile(buffer, 'w')
zip.write(first_path)
zip.write(second_path)
zip.close()

打开我创建的zip文件后,我有一个home文件夹,其中有两个子文件夹,firstsecond,然后是pdf文件。我不知道如何仅包含两个pdf文件,而不是将完整路径压缩到zip存档中。我希望我的问题清楚,请帮忙。感谢。

5 个答案:

答案 0 :(得分:99)

zipfile write()方法支持一个额外的参数(arcname),它是存储在zip文件中的存档名称,因此您只需要用以下代码更改代码:

from os.path import basename
...
zip.write(first_path, basename(first_path))
zip.write(second_path, basename(second_path))
zip.close()

如果您有空闲时间阅读zipfile的文档,将会很有帮助。

答案 1 :(得分:8)

我使用此函数来压缩目录而不包含绝对路径

a = -sl_x
b = -sl_y
c = 1
d = -i0

答案 2 :(得分:5)

我怀疑可能有一个更优雅的解决方案,但这个应该有效:

def add_zip_flat(zip, filename):
    dir, base_filename = os.path.split(filename)
    os.chdir(dir)
    zip.write(base_filename)

zip = zipfile.ZipFile(buffer, 'w')
add_zip_flat(zip, first_path)
add_zip_flat(zip, second_path)
zip.close()

答案 3 :(得分:2)

您可以使用arcname参数覆盖存档中的文件名:

with zipfile.ZipFile(file="sample.zip", mode="w", compression=zipfile.ZIP_DEFLATED) as out_zip:
for f in Path.home().glob("**/*.txt"):
    out_zip.write(f, arcname=f.name)

文档参考:https://docs.python.org/3/library/zipfile.html#zipfile.ZipFile.write

答案 4 :(得分:1)

也可以通过这种方式(允许创建大于2GB的档案)

import os, zipfile
def zipdir(path, ziph):
    """zipper"""
    for root, _, files in os.walk(path):
        for file_found in files:
            abs_path = root+'/'+file_found
            ziph.write(abs_path, file_found)
zipf = zipfile.ZipFile(DEST_FILE.zip, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zipdir(SOURCE_DIR, zipf)
zipf.close()