14

当初は使用を考えてos.path.isdirいましたが、zipファイルでは機能しないと思います。zipファイルを調べて、このディレクトリが存在することを確認する方法はありますか?unzip -l "$@"なるべく使わないようにしたいと思いますが、それが唯一の解決策だとしたら仕方がないと思います。

4

4 に答える 4

13

ファイル名の最後に「/」が付いていることを確認してください。

import zipfile

def isdir(z, name):
    return any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist())

f = zipfile.ZipFile("sample.zip", "r")
print isdir(f, "a")
print isdir(f, "a/b")
print isdir(f, "a/X")

この行を使用します

any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist())

アーカイブにディレクトリが明示的に含まれていない可能性があるため。ディレクトリ名を持つパスだけです。

実行結果:

$ mkdir -p a/b/c/d
$ touch a/X
$ zip -r sample.zip a
adding: a/ (stored 0%)
adding: a/X (stored 0%)
adding: a/b/ (stored 0%)
adding: a/b/c/ (stored 0%)
adding: a/b/c/d/ (stored 0%)

$ python z.py
True
True
False
于 2012-07-23T17:38:17.327 に答える
6

ZipFile.namelist()を使用してディレクトリを確認できます。

import os, zipfile
dir = "some/directory/"

z = zipfile.ZipFile("myfile.zip")
if dir in z.namelist():
    print "Found %s!" % dir
于 2012-07-23T17:32:11.793 に答える
2

Python(> = 3.6)の場合:

これはis_dir()、Pythonソースコードで実装された方法です。

def is_dir(self):
    """Return True if this archive member is a directory."""
    return self.filename[-1] == '/'

ファイル名がスラッシュで終わっているかどうかをチェックするだけです/。特定の状況でこれが正しく機能するかどうかはわかりません(したがって、IMOは正しく実装されていません)。

Python(<3.6)の場合:

print(zipinfo)示されているように、filemode対応するプロパティまたはフィールドが提供されていないので、zipfileモジュールのソースコードを調べて、それがどのように実装されているかを見つけました。(def __repr__(self): https://github.com/python/cpython/blob/3.6/Lib/zipfile.pyを参照してください)

おそらく悪い考えですが、うまくいくでしょう:

シンプルで簡単なものが必要な場合、これはほとんどの場合に機能しますが、場合によってはこのフィールドが印刷されないため、失敗する可能性があります。

def is_dir(zipinfo):
    return "filemode='d" in zipinfo.__repr__()

ついに:

私の解決策は、ファイルモードを手動でチェックし、参照されるファイルが実際にhttps://github.com/python/cpython/blob/3.6/Lib/zipfile.py行391に触発されたディレクトリであるかどうかを判断することです。

def is_dir(fileinfo):
    hi = fileinfo.external_attr >> 16
    return (hi & 0x4000) > 0
于 2018-11-14T03:28:57.383 に答える
0

これは、組み込みのライブラリZipFileを使用して実行できます。

import zipfile
z = zipfile.ZipFile("file.zip")

if "DirName/" in [member.filename for member in z.infolist()]:
    print("Directory exists in archive")

Python32でテストされ、機能します。

于 2012-07-23T17:46:13.327 に答える