特定のソースディレクトリ(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。
zipfile.write()
メソッドは、オプションのarcname
引数を取り、zipfile内のファイル名を指定します。
これを使用して、最初にsrc
へのパスを取り除くことができます。ここでは os.path.abspath()
を使用して、src
とos.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
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))