在文件夹及其子文件夹中解压zip文件

8

我尝试解压缩150个zip文件。所有的zip文件都有不同的名称,并且它们都分布在一个大文件夹中,该文件夹分成很多子文件夹和子子文件夹。我想将每个归档文件提取到具有与原始zip文件名称相同的同名文件夹中,并且也位于原始zip文件所在的同一位置。我的代码如下:

import zipfile    
import os,os.path,sys  

pattern = '*.zip'  
folder = r"C:\Project\layers"   
files_process = []  
for root,dirs,files in os.walk(r"C:\Project\layers"):  
    for filenames in files:  
        if filenames == pattern:  
            files_process.append(os.path.join(root, filenames))  
            zip.extract() 

运行代码后没有任何反应。

非常感谢您的帮助!


使用 zipfile 模块:https://docs.python.org/2/library/zipfile.html - myaut
1
extract_zip - Barun Sharma
3个回答

16

更新:

最终,这段代码对我起作用了:

import zipfile,fnmatch,os

rootPath = r"C:\Project"
pattern = '*.zip'
for root, dirs, files in os.walk(rootPath):
    for filename in fnmatch.filter(files, pattern):
        print(os.path.join(root, filename))
        zipfile.ZipFile(os.path.join(root, filename)).extractall(os.path.join(root, os.path.splitext(filename)[0]))

3
请使用os.path.splitext(filename)[0]代替filename.split('.')[0]。如果文件名中有多个点,则后者会返回错误的结果。 - jfs

7
你可以使用 Path.rglob() 递归枚举zip文件,使用 shutil.unpack_archive() 解压缩zip文件:
#!/usr/bin/env python3
import logging
from pathlib import Path
from shutil import unpack_archive

zip_files = Path(r"C:\Project\layers").rglob("*.zip")
while True:
    try:
        path = next(zip_files)
    except StopIteration:
        break # no more files
    except PermissionError:
        logging.exception("permission error")
    else:
         extract_dir = path.with_name(path.stem)
         unpack_archive(str(path), str(extract_dir), 'zip')

该工具会将每个压缩文件解压到与原始zip文件同名的文件夹中,同时也在原始zip文件所在的位置进行解压。例如,它将'layers/dir/file.zip'压缩文件解压到'layers/dir/file'目录中。


我遇到了一个错误:Traceback (most recent call last): File "D:\desktop\python.py", line 2, in <module> from pathlib import Path ImportError: 没有名为pathlib的模块。 - newGIS
我正在使用Python 2.7.8 Shell。 - newGIS
J.F.Sebastian,我必须使用Python 2.7.8进行工作,因此我安装了pathlib。但现在我遇到了一个错误:Traceback(最近的调用最先):文件“C:\ yaron \ shonot \ software \ gis \ tools \ YARON_SCRIPTS \ unzip.py”,第3行,在<module>中from shutil import unpack_archive ImportError:无法导入名称unpack_archive。 - newGIS
@Y.Y.C,你是否在shutil模块的文档中看到了unpack_archive()函数?你可以使用zipfile模块来解压缩归档文件。在Windows上,使用unicode而不是str来表示文件名。 - jfs
对于unpack_archiverglob,我给予+1的推荐。之前并不知道这两个函数。 - mgk
显示剩余6条评论

0

解压缩所有文件到临时文件夹(Ubuntu)

import tempfile
import zipfile

tmpdirname = tempfile.mkdtemp()

zf = zipfile.ZipFile('/path/to/zipfile.zip')

for fn in zf.namelist():
    temp_file = tmpdirname+"/"+fn
    #print(temp_file)

    f = open(temp_file, 'w')
    f.write(zf.read(fn).decode('utf-8'))
    f.close()

解码假定文件是文本文件。 - George Fisher
我建议使用 os.path.join(tmpdirname, fn) 而不是 tmpdirname+"/"+fn - Ivan De Paz Centeno
你可以以二进制形式打开temp_file,这样就不需要解码它,并使用上下文管理器处理文件句柄,这样就不需要 f.close()了。例如:with open(temp_file, 'wb') as f: 更好的方法是用zipfile.extractall方法替换对namelist的循环,并将tmpdirname作为路径提供。但这并没有回答问题。问题中没有提到临时目录,它要求“我希望将每个存档文件提取到与原始zip文件名相同的单独文件夹中,并且在原始zip文件所在的同一位置”。 - Davos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接