0

I must use Python 2.6! This is a task that I really want to automate, the situation is static and once I create this, I'll be golden (good). I must create one, stand alone script (in Idle, I hope) that will:

  1. Unzip a single original zipfile (in_Zip) to the contents of the folder that the zipfile currently resides.
  2. Go to the unique (NON ZIPPED) folders (actually student usernames 'aforker', 'allisw99', 'btaylor7', etc) that result from step 1. (there may be anywhere from 1 to 40 of these unique student folders)
  3. within each unique folder ('aforker', 'allisw99', 'btaylor7', etc) extract any and all (could be none, could be 3 or 4) .zip files within, to their relative aforementioned unique folders ('aforker', 'allisw99', 'btaylor7', etc), while 'navigating' i.e. not getting hung up on possible .pdf or docx files that may or may not reside in the unique folders ('aforker', 'allisw99', 'btaylor7', etc)

This is what I've got so far: (and it 'works') (I'll modify later so that I do not need to hard-code the original 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

It works, I get the following in the 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/']
'>>> '

But, what I can't figure out is how to get 'into' each unique folder: aforker, allisw99, etc. and then extract any and all zips within 'aforker', 'allisw99', etc.

I've had some suggestions on other forums/list serves, but they all involve trashing my current code and doing things in the windows command window, etc. a) I can't get them to work, and b) it doesn't really help me because I need ONE stand alone .py file to make this all work.

Why? you ask? I will be using this to create an ArcGIS 'tool' that requires one script (at least for me to comprehend it) :-)

Thank you in advance for any and all suggestions, tips etc.

For the record, I did try the following @ the bottom of the code above:

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

but I get the following error:

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/'
Dharman
  • 30,962
  • 25
  • 85
  • 135
Gregory Lund
  • 21
  • 1
  • 3

2 Answers2

2

With the help of nnoenneo (the other answerer above or below) Peter Otten, & Oscar Benjamin (on a different (python.org) forum), I was able to come up with the following code that works.

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

If creating a tool in Esri's ArcGIS, one would have to replace the 'in_Zip' line with: in_Zip = arcpy.GetParameterAsText(0)

and the 'outDir' line with: outDir = os.getcwd()

and then in the properties of the tool in ArcGIS browse to the .py file that contains the code above.

Special Thanks to Peter Otten and Oscar Benjamin on python.org who have been helping me struggle through this since August 7th 2012!

Regards, Greg

Bill F
  • 723
  • 11
  • 23
Gregory Lund
  • 21
  • 1
  • 3
  • note: a maliciously created (or out of ignorance) zip archive can overwrite files outside `outDir`. Check that `item` is not an absolute path or there is no ".." in it. – jfs Sep 25 '12 at 15:40
0

That extra code almost works, but you'll want to make sure you're unzipping a zip file (and not, say, a directory):

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()
nneonneo
  • 171,345
  • 36
  • 312
  • 383