尝试解压缩zip文件,然后在结果文件夹中找到并解压缩任何/所有zip文件

时间:2012-09-21 17:14:38

标签: python zipfile

我必须使用Python 2.6! 这是一项我真正想要自动化的任务,情况是静态的,一旦我创建了这个,我就会变得很好(好)。 我必须创建一个独立的脚本(在Idle,我希望),它将:

  1. 将单个原始zipfile(in_Zip)解压缩到zipfile当前所在文件夹的内容。
  2. 转到步骤1中产生的唯一(NON ZIPPED)文件夹(实际上是学生用户名'aforker','allisw99','btaylor7'等)。(这些唯一学生文件夹中可能有1到40个) )
  3. 在每个独特的文件夹('aforker','allisw99','btaylor7'等)中提取任何和所有(可能是无,可能是3或4).zip文件,在其相关的上述独特文件夹中(' aforker','allisw99','btaylor7'等),同时'导航'即不会挂起可能存在或不存在于唯一文件夹中的.pdf或docx文件('aforker','allisw99',' btaylor7'等)
  4. 这是我到目前为止所做的:(并且它“有效”)(我稍后会修改,以便我不需要对原始zipfile进行硬编码(in_Zip))

    import os, os.path, zipfile
    inZip = r'D:\D_Drive_Documents\Student_Work_Sample_usecopy1\2012-09-18 Lab_2.zip'
    outDir = r"D:\D_Drive_Documents\Student_Work_Sample_usecopy1"
    
    z = zipfile.ZipFile(in_Zip,'a')
    z.extractall(outDir)
    zipContents = z.namelist()
    
    print zipContents
    z.close
    

    它有效,我在Python Shell中得到以下内容:

    '>>> ================================ RESTART ================================'
    '>>>' 
    ['Lab_2/aforker/', 'Lab_2/aforker/aforker_Lab2.zip', 'Lab_2/allisw99/', 'Lab_2/allisw99/allisw99_Lab2.zip', 'Lab_2/allisw99/allisw99_Lab2_Bonus.pdf', 'Lab_2/allisw992/', 'Lab_2/allisw992/allisw99_Lab2_Bonus.pdf', 'Lab_2/btaylor7/', 'Lab_2/btaylor7/2nd_btaylor7_Lab2.zip', 'Lab_2/btaylor7/btaylor7_Lab2.zip', 'Lab_2/']
    '>>> '
    

    但是,我无法弄清楚的是如何进入'每个独特的文件夹:aforker,allisw99等,然后在'aforker','allisw99'等中提取任何和所有拉链。

    我对其他论坛/列表服务有一些建议,但它们都涉及破坏我当前的代码并在Windows命令窗口中执行操作等。 a)我无法让他们工作,并且b)它并没有真正帮助我,因为我需要一个独立的.py文件才能使这一切工作。

    为什么呢?你问?我将使用它来创建一个需要一个脚本的ArcGIS“工具”(至少让我理解它): - )

    提前感谢您提供任何建议,提示等。

    为了记录,我确实在上面代码的底部尝试了以下内容:

    for item in zipContents:
         itemLoc = os.path.join(outDir,item)
         y = zipfile.ZipFile(itemLoc,'a')
         y.extractall(os.path.aplit(itemLoc)[0])
         y.close
    

    但是我收到以下错误:

    Traceback (most recent call last):
      File "D:\D_Drive_Documents\Scripts\Unzip_a_zip_of_zips\Scripts\unzip_a_zip.py", line 50, in <module>
        y = zipfile.ZipFile(itemLoc,'a')
      File "C:\Python26\ArcGIS10.0\lib\zipfile.py", line 687, in __init__
        self.fp = open(file, modeDict[mode])
    IOError: [Errno 13] Permission denied: 'D:\\D_Drive_Documents\\Student_Work_Sample_usecopy1\\Lab_2/aforker/'
    

    提前感谢所有输入!

    格雷格

2 个答案:

答案 0 :(得分:1)

在nnoenneo(其他回答者上方或下方)的帮助下,Peter Otten,&amp;奥斯卡本杰明(在另一个(python.org)论坛上),我能够提出以下有效的代码。

import os, os.path, zipfile, arcpy

in_Zip = r'D:\D_Drive_Documents\Student_Work_Sample_usecopy1\2012-09-18 Lab_2.zip'

outDir = r"D:\D_Drive_Documents\Student_Work_Sample_usecopy1"

z = zipfile.ZipFile(in_Zip,'r')

z.extractall(outDir)

zipContents = z.namelist()
z.close()

for item in zipContents:
    if item.endswith('.zip'):
        fullpath = os.path.join(outDir, item)
        x = zipfile.ZipFile(fullpath,'r')
        dest_path = os.path.dirname(fullpath)
        x.extractall(dest_path)
        x.close()

如果在Esri的ArcGIS中创建工具,则必须将'in_Zip'行替换为: in_Zip = arcpy.GetParameterAsText(0)

和'outDir'行: outDir = os.getcwd()

然后在ArcGIS中工具的属性中浏览到包含上述代码的.py文件。

特别感谢Peter Otten和Oscar Benjamin在python.org上自2012年8月7日以来一直在帮助我解决这个问题!

此致 格雷格

答案 1 :(得分:0)

额外的代码几乎可以工作,但你要确保你解压缩zip文件(而不是,例如,目录):

for item in zipContents:
     if item.endswith('.zip'):
         itemLoc = os.path.join(outDir,item)
         y = zipfile.ZipFile(itemLoc,'a')
         y.extractall(os.path.split(itemLoc)[0]) # This is going to unzip to C:\\ -- you will want to change that
         y.close()