簡體   English   中英

我如何使用 zip 文件夾的內容 python(版本 2.5)?

[英]How do I zip the contents of a folder using python (version 2.5)?

一旦我在特定文件夾中擁有我需要的所有文件,我希望我的 python 腳本到 zip 文件夾內容。

這可能嗎?

我怎么能 go 關於這樣做呢?

在python 2.7上,您可以使用: shutil.make_archive(base_name,format [,root_dir [,base_dir [,verbose [,dry_run [,owner [,group [,logger]]]]]]]]]]]))

base_name存檔名稱減去擴展名

備份文件的格式格式

要壓縮的root_dir目錄。

例如

 shutil.make_archive(target_file, format="bztar", root_dir=compress_me)    

腳本的改編版本為:

#!/usr/bin/env python
from __future__ import with_statement
from contextlib import closing
from zipfile import ZipFile, ZIP_DEFLATED
import os

def zipdir(basedir, archivename):
    assert os.path.isdir(basedir)
    with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z:
        for root, dirs, files in os.walk(basedir):
            #NOTE: ignore empty directories
            for fn in files:
                absfn = os.path.join(root, fn)
                zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path
                z.write(absfn, zfn)

if __name__ == '__main__':
    import sys
    basedir = sys.argv[1]
    archivename = sys.argv[2]
    zipdir(basedir, archivename)

例:

C:\zipdir> python -mzipdir c:\tmp\test test.zip

它使用'c:\\tmp\\test'目錄的內容創建'C:\\zipdir\\test.zip'存檔。

這是一個遞歸版本

def zipfolder(path, relname, archive):
    paths = os.listdir(path)
    for p in paths:
        p1 = os.path.join(path, p) 
        p2 = os.path.join(relname, p)
        if os.path.isdir(p1): 
            zipfolder(p1, p2, archive)
        else:
            archive.write(p1, p2) 

def create_zip(path, relname, archname):
    archive = zipfile.ZipFile(archname, "w", zipfile.ZIP_DEFLATED)
    if os.path.isdir(path):
        zipfolder(path, relname, archive)
    else:
        archive.write(path, relname)
    archive.close()

jfs 的解決方案和 Kozyarchuk 的解決方案都適用於 OP 的用例,但是:

  • jfs 的解決方案將所有文件壓縮到源文件夾中,並將它們存儲在根級別的 zip 中(不保留 zip 結構中的原始源文件夾)。
  • Kozyarchuk 的解決方案無意中將新創建的 zip 文件放入自身,因為它是一個遞歸解決方案(例如,使用此代碼創建新的 zip 文件“myzip.zip”將導致存檔“myzip.zip”本身包含一個空文件“myzip.zip”。壓縮”)

因此,這里有一個解決方案,只需將源文件夾(以及任何深度的任何子文件夾)添加到 zip 存檔。 這是因為您無法將文件夾名稱傳遞給內置方法ZipFile.write() - 下面的add_folder_to_zip()提供了一種將文件夾及其所有內容添加到 zip 的簡單方法檔案。 下面的代碼適用於 Python2 和 Python3。

import zipfile
import os

def add_folder_to_zip(src_folder_name, dst_zip_archive):
    """ Adds a folder and its contents to a zip archive

        Args:
            src_folder_name (str): Source folder name to add to the archive
            dst_zip_archive (ZipFile):  Destination zip archive

        Returns:
            None
    """
    for walk_item in os.walk(src_folder_name):
        for file_item in walk_item[2]:
            # walk_item[2] is a list of files in the folder entry
            # walk_item[0] is the folder entry full path 
            fn_to_add = os.path.join(walk_item[0], file_item)
            dst_zip_archive.write(fn_to_add)

if __name__ == '__main__':
    zf = zipfile.ZipFile('myzip.zip', mode='w')
    add_folder_to_zip('zip_this_folder', zf)
    zf.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM