当前位置:  开发笔记 > 编程语言 > 正文

使用python解压缩目录结构

如何解决《使用python解压缩目录结构》经验,为你挑选了4个好方法。

我有一个zip文件,其中包含以下目录结构:

dir1\dir2\dir3a
dir1\dir2\dir3b

我正在尝试解压缩它并维护目录结构但是我收到错误:

IOError: [Errno 2] No such file or directory: 'C:\\\projects\\\testFolder\\\subdir\\\unzip.exe'

其中testFolder是dir1,而subdir是dir2.

是否有快速解压缩文件和维护目录结构的方法?



1> Jeff..:

如果你使用的是Python 2.6,那么extract和extractall方法都很棒.我现在必须使用Python 2.5,所以我只需要创建目录,如果它们不存在.您可以使用该namelist()方法获取目录列表.目录将始终以正斜杠结束(即使在Windows上),例如,

import os, zipfile

z = zipfile.ZipFile('myfile.zip')
for f in z.namelist():
    if f.endswith('/'):
        os.makedirs(f)

你可能不希望完全这样做(也就是说,当你迭代名单时,你可能想要提取zip文件的内容),但是你明白了.


可能想在try中包装`os.makedirs(f)`:除了(OSError,WindowsError):阻止以防文件夹已经存在.

2> bobince..:

不要信任extract()或extractall().

这些方法盲目地将文件提取到文件名中给出的路径.但ZIP文件名可以是任何东西,包括危险的字符串,如"x /../../../ etc/passwd".提取此类文件,您可能刚刚破坏了整个服务器.

也许这应该被认为是Python的zipfile模块中的一个可报告的安全漏洞,但是过去任何数量的zip-dearchivers都表现出完全相同的行为.要安全地取消归档具有文件夹结构的ZIP文件,您需要深入检查每个文件路径.


看起来自2.7.4以来它已经改变:http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extractall"zipfile模块试图阻止它."

3> DNS..:

我试过了,可以重现它.该extractall方法,如其他答案建议,并没有解决问题.这看起来像zipfile模块中的一个错误(也许仅限于Windows?),除非我误解了zipfiles的结构.

testa\
testa\testb\
testa\testb\test.log
> test.zip

>>> from zipfile import ZipFile
>>> zipTest = ZipFile("C:\\...\\test.zip")
>>> zipTest.extractall("C:\\...\\")
Traceback (most recent call last):
  File "", line 1, in 
  File "...\zipfile.py", line 940, in extractall
  File "...\zipfile.py", line 928, in extract
  File "...\zipfile.py", line 965, in _extract_member
IOError: [Errno 2] No such file or directory: 'C:\\...\\testa\\testb\\test.log'

如果我这样做printdir(),我会得到这个(第一栏):

>>> zipTest.printdir()
File Name
testa/testb/
testa/testb/test.log

如果我尝试仅提取第一个条目,如下所示:

>>> zipTest.extract("testa/testb/")
'C:\\...\\testa\\testb'

在磁盘上,这会导致创建一个文件夹testa,里面有一个文件 testb.这显然是后续尝试提取test.log失败的原因; testa\testb是文件,而不是文件夹.

编辑#1:如果只提取文件,那么它可以工作:

>>> zipTest.extract("testa/testb/test.log")
'C:\\...\\testa\\testb\\test.log'

编辑#2:杰夫的代码是要走的路; 迭代namelist; 如果是目录,请创建目录.否则,解压缩文件.



4> 小智..:

我知道说这可能有点晚,但杰夫是对的.它很简单:

import os
from zipfile import ZipFile as zip

def extractAll(zipName):
    z = zip(zipName)
    for f in z.namelist():
        if f.endswith('/'):
            os.makedirs(f)
        else:
            z.extract(f)

if __name__ == '__main__':
    zipList = ['one.zip', 'two.zip', 'three.zip']
    for zip in zipList:
        extractAll(zipName)


好像`zipfile.ZipFile(zip_name).extractall()`就是这么做的.
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有