当初は使用を考えてos.path.isdir
いましたが、zipファイルでは機能しないと思います。zipファイルを調べて、このディレクトリが存在することを確認する方法はありますか?unzip -l "$@"
なるべく使わないようにしたいと思いますが、それが唯一の解決策だとしたら仕方がないと思います。
4 に答える
ファイル名の最後に「/」が付いていることを確認してください。
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
ZipFile.namelist()を使用してディレクトリを確認できます。
import os, zipfile
dir = "some/directory/"
z = zipfile.ZipFile("myfile.zip")
if dir in z.namelist():
print "Found %s!" % dir
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
これは、組み込みのライブラリZipFileを使用して実行できます。
import zipfile
z = zipfile.ZipFile("file.zip")
if "DirName/" in [member.filename for member in z.infolist()]:
print("Directory exists in archive")
Python32でテストされ、機能します。