最初我考虑使用os.path.isdir
,但我不认为这适用于zip文件。有没有办法窥视zip文件并验证该目录是否存在?我想尽量避免使用unzip -l "$@"
,但如果这是唯一的解决方案,那么我想我别无选择。
答案 0 :(得分:7)
只需检查文件名末尾的“/”即可。
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
答案 1 :(得分:6)
您可以使用ZipFile.namelist()检查目录。
import os, zipfile
dir = "some/directory/"
z = zipfile.ZipFile("myfile.zip")
if dir in z.namelist():
print "Found %s!" % dir
答案 2 :(得分: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进行测试和功能。
答案 3 :(得分:0)
这是在Python源代码中实现login()
的方式:
class <ComponentName> extends Component {
componentDidMount() {
// Update this line here so that the login() method
// injected by connect() is called (ie via this.props)
this.props.login()
}
render() {
if(this.props.isLogged)
return <App/>
else
return <ErrorScreen/>
}
}
它只是检查文件名是否以斜杠is_dir()
结尾,无法确定在某些情况下它是否可以正常工作(因此IMO实施得不好)。
由于def is_dir(self):
"""Return True if this archive member is a directory."""
return self.filename[-1] == '/'
将显示/
,但没有提供相应的属性或字段,因此,我深入研究zipfile模块源代码,并发现其实现方式。
(请参见print(zipinfo)
https://github.com/python/cpython/blob/3.6/Lib/zipfile.py)
如果您想要简单易用的东西,则在大多数情况下都可以使用,但可能会失败,因为在某些情况下不会打印此字段。
filemode
我的解决方案是手动检查文件模式,并确定引用的文件是否实际上是受https://github.com/python/cpython/blob/3.6/Lib/zipfile.py第391行启发的目录。
def __repr__(self):