4

.zipPythonでファイルをあるディレクトリoutput_dirに解凍し、解凍によって作成されたすべてのディレクトリのリストを取得するにはどうすればよいですか?たとえば、私が持っている場合:

unzip('myzip.zip', 'outdir')

outdir他のファイル/ディレクトリが含まれている可能性のあるディレクトリです。解凍したら、圧縮の結果として作成されたすべてのディレクトリを返しmyzip.zipたいのですが。これまでの私のコードは次のとおりです。unzipoutdir/

import zipfile
def unzip(zip_file, outdir):
    """
    Unzip a given 'zip_file' into the output directory 'outdir'.
    """
    zf = zipfile.ZipFile(zip_file, "r")
    zf.extractall(outdir)

作成したdirをどのようにunzip返品できoutdirますか?ありがとう。

編集:私にとって最も理にかなっている解決策は、zipファイルのトップレベルのディレクトリのみを取得し、それらを再帰的にウォークスルーすることです。これにより、zipで作成されたすべてのファイルを確実に取得できます。これは可能ですか?名前リストのシステム固有の動作により、信頼することは事実上不可能になります

4

4 に答える 4

9

メソッドを使用してzipファイルの内容を読み取ることができますnamelist()。ディレクトリには、末尾のパス区切り文字があります。

>>> import zipfile
>>> zip = zipfile.ZipFile('test.zip')
>>> zip.namelist()
['dir2/', 'file1']

これは、コンテンツを抽出する前または後に行うことができます。

動作環境に応じて、結果はnamelist()zipアーカイブのトップレベルパスに制限される場合があり(LinuxのPythonなど)、アーカイブのコンテンツ全体をカバーする場合があります(WindowsのIronPythonなど)。

は、zipアーカイブの内容のnamelist()完全なリストを返します。ディレクトリには、末尾のパス区切り文字が付いています。たとえば、次のファイル構造のzipアーカイブ:

./file1
./dir2
./dir2/dir21
./dir3
./dir3/file3
./dir3/dir31
./dir3/dir31/file31

結果として、次のリストが返されzipfile.ZipFile.namelist()ます。

[ 'file1', 
  'dir2/', 
  'dir2/dir21/', 
  'dir3/', 
  'dir3/file3', 
  'dir3/dir31/', 
  'dir3/dir31/file31' ]
于 2013-02-04T21:48:03.647 に答える
1

ZipFile.namelistアーカイブ内のアイテムの名前のリストを返します。ただし、これらの名前は、ディレクトリパスを含むファイルのフルネームのみになります。(zipファイルにはディレクトリではなくファイルのみを含めることができるため、ディレクトリはアーカイブメンバー名によって示されます。)作成されたディレクトリを特定するには、各ファイルによって暗黙的に作成されたすべてのディレクトリのリストが必要です。

以下のdirs_in_zip()関数はこれを実行し、すべてのディレクトリ名をセットに収集します。

import zipfile
import os

def parent_dirs(pathname, subdirs=None):
    """Return a set of all individual directories contained in a pathname

    For example, if 'a/b/c.ext' is the path to the file 'c.ext':
    a/b/c.ext -> set(['a','a/b'])
    """
    if subdirs is None:
        subdirs = set()
    parent = os.path.dirname(pathname)
    if parent:
        subdirs.add(parent)
        parent_dirs(parent, subdirs)
    return subdirs


def dirs_in_zip(zf):
    """Return a list of directories that would be created by the ZipFile zf"""
    alldirs = set()
    for fn in zf.namelist():
        alldirs.update(parent_dirs(fn))
    return alldirs


zf = zipfile.ZipFile(zipfilename, 'r')

print(dirs_in_zip(zf))
于 2013-02-04T22:25:00.627 に答える
0

それを終了させて​​から、ディレクトリの内容を読んでください-これはこの良い例です。

于 2013-02-04T21:45:59.237 に答える
0

他の誰も同時にターゲットディレクトリに書き込みを行わないことを前提として、解凍する前にディレクトリを再帰的にウォークし、その後、結果を比較します。

于 2013-02-04T21:50:37.207 に答える