web-dev-qa-db-ja.com

Pythonで.Zipを作成しますか?

特定のソースディレクトリ(src)の内容をZipファイル(dst)に圧縮する関数をスクリプトで作成しようとしています。たとえば、Zip('/path/to/dir', '/path/to/file.Zip')の場合、/path/to/dirはディレクトリであり、/path/to/file.Zipはまだ存在しません。 I しないディレクトリ自体を圧縮したい、これは私の場合すべての違いになります。ディレクトリ内のファイル(およびサブディレクトリ)を圧縮します。これは私が試していることです:

def Zip(src, dst):
    zf = zipfile.ZipFile("%s.Zip" % (dst), "w")
    for dirname, subdirs, files in os.walk(src):
        zf.write(dirname)
        for filename in files:
            zf.write(os.path.join(dirname, filename))
    zf.close()

これにより、基本的に/。たとえば、/path/to/dir、Zipを抽出すると、「パス」が含まれるディレクトリが作成され、そのディレクトリに「to」が含まれます。

誰もがこの問題を引き起こさない機能を持っていますか?

これを十分に強調することはできません。それは、ディレクトリ自体ではなく、ディレクトリ内のファイルを圧縮することですneeds

34
tkbx

zipfile.write() メソッドは、オプションのarcname引数を取り、zipfile内のファイル名を指定します。

これを使用して、最初にsrcへのパスを取り除くことができます。ここでは os.path.abspath() を使用して、srcos.walk()によって返されるファイル名の両方に共通のプレフィックスがあることを確認します。

#!/usr/bin/env python2.7

import os
import zipfile

def Zip(src, dst):
    zf = zipfile.ZipFile("%s.Zip" % (dst), "w", zipfile.Zip_DEFLATED)
    abs_src = os.path.abspath(src)
    for dirname, subdirs, files in os.walk(src):
        for filename in files:
            absname = os.path.abspath(os.path.join(dirname, filename))
            arcname = absname[len(abs_src) + 1:]
            print 'zipping %s as %s' % (os.path.join(dirname, filename),
                                        arcname)
            zf.write(absname, arcname)
    zf.close()

Zip("src", "dst")

このようなディレクトリ構造では:

src
└── a
    ├── b
    │   └── bar
    └── foo

スクリプトは次を印刷します。

zipping src/a/foo as a/foo
zipping src/a/b/bar as a/b/bar

結果のZipファイルの内容は次のとおりです。

Archive:  dst.Zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-28-13 11:36   a/foo
        0  01-28-13 11:36   a/b/bar
 --------                   -------
        0                   2 files
57
andrewdotn

arcnameパラメーター を使用して、Zipファイルの名前/パスを制御します。

たとえば、ファイルのみを含み、ディレクトリを含まないZipファイルの場合:

zf.write(os.path.join(dirname, filename), arcname=filename)

または、Zipファイル内に新しいディレクトリを作成するには:

zf.write(os.path.join(dirname, filename), arcname=os.path.join("my_Zip_dir", filename))
1
Jon-Eric