检查带有Python的zip文件中是否存在目录

时间:2012-07-23 17:28:15

标签: python unzip

最初我考虑使用os.path.isdir,但我不认为这适用于zip文件。有没有办法窥视zip文件并验证该目录是否存在?我想尽量避免使用unzip -l "$@",但如果这是唯一的解决方案,那么我想我别无选择。

4 个答案:

答案 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(> = 3.6):

这是在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实施得不好)。

适用于python(<3.6):

由于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):