【问题标题】:Unzip zip files in folders and subfolders解压缩文件夹和子文件夹中的 zip 文件
【发布时间】:2015-04-05 00:21:48
【问题描述】:

我尝试解压缩 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() 

在我运行代码之后,什么也没发生。 提前感谢您对此的任何帮助。

【问题讨论】:

标签: python unzip


【解决方案1】:

您可以使用Path.rglob() 递归枚举压缩文件,使用shutil.unpack_archive() 解压缩压缩文件:

#!/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')

“将每个存档提取[s] 到与原始 zip 文件名称相同且与原始 zip 文件同名的文件夹” 例如,它提取 'layers/dir/file.zip'归档到'layers/dir/file' 目录中。

【讨论】:

  • 我收到一个错误:回溯(最近一次调用最后一次):文件“D:\desktop\python.py”,第 2 行,在 中来自 pathlib 导入路径 ImportError:没有名为 pathlib 的模块
  • 我使用 python 2.7.8 shell
  • @Y.Y.C:有一个用于 Python 2 的 pathlib 的反向移植。运行 pip install pathlibinstall Python 3
  • 我在哪里安装 pathlib?
  • @Y.Y.C:只需运行pip 命令。如果您不知道命令行是什么或不知道 pip 命令的作用;问一个单独的问题(或(更有可能)找到一个现有的问题)。
【解决方案2】:

更新:

最后,这段代码对我有用:

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]))

【讨论】:

  • 使用os.path.splitext(filename)[0] 而不是filename.split('.')[0] 如果文件名中有多个点,则后者返回错误的结果。
【解决方案3】:

将所有文件解压缩到一个临时文件夹(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()

【讨论】:

  • 解码假定文件是文本
  • 我鼓励使用os.path.join(tmpdirname, fn) 而不是tmpdirname+"/"+fn
  • 您可以将 temp_file 作为二进制文件打开,这样您就不需要对其进行解码,并对文件句柄使用上下文管理器,这样您就不需要 f.close() ,例如with open(temp_file, 'wb') as f: 更好的是,您可以用 zipfile.extractall 方法替换 namelist 上的循环,并提供 tmpdirname 作为路径。但这并不能回答问题。该问题未提及临时目录,它询问“我想将每个存档提取到与原始 zip 文件名相同名称的单独文件夹,并且与原始 zip 文件在同一位置
猜你喜欢
  • 2016-01-10
  • 2010-09-05
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多