用python解压目录结构

2024-06-29 00:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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。

有没有一种快速解压文件并维护目录结构的方法?


Tags: 文件no目录错误zip结构subdirerrno
2条回答

如果您使用的是Python2.6,那么extract和extractall方法非常好。我现在必须使用Python2.5,所以如果目录不存在,我只需要创建它们。您可以使用namelist()方法获得目录列表。目录总是以正斜杠结尾(即使在Windows上),例如

import os, zipfile

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

您可能不想这样做完全(也就是说,您可能希望在遍历名称列表时提取zip文件的内容),但是您得到了这个想法。

我试过了,可以复制。正如其他答案所建议的,extractall方法不能解决问题。对我来说,这似乎是zipfile模块中的一个bug(也许仅限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 "<stdin>", line 1, in <module>
  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:Jeff的代码就是这样;遍历namelist;如果是目录,则创建目录。否则,提取文件。

相关问题 更多 >