Python(バージョン2.5)を使用してフォルダーの内容を圧縮するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/296499

  •  08-07-2019
  •  | 
  •  

質問

特定のフォルダに必要なファイルがすべて揃ったら、pythonスクリプトでフォルダの内容を圧縮したいと思います。

これは可能ですか?

そして、どうすればそれを実行できますか?

役に立ちましたか?

解決

スクリプト:

#!/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' アーカイブを作成します。

他のヒント

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)    

これは再帰バージョンです

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()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top