2012-09-21 214 views
0

我必須使用Python 2.6! 這是一個我真正想要自動化的任務,情況是靜態的,一旦我創建了這個,我就會變成金色的(好的)。 我必須創建一個獨立的腳本(空閒,我希望),將:試圖解壓縮zipfile,然後在結果文件夾中找到並解壓縮任何/所有zip文件

  1. 解壓一個原始的壓縮文件(in_Zip)到zip文件當前所在的文件夾中的內容。
  2. 轉到步驟1產生的唯一(非ZIPPED)文件夾(實際上是學生用戶名'aforker','allisw99','btaylor7'等)。(這些獨特學生文件夾中可能有1到40個任意位置)
  3. 在每個獨特的文件夾('aforker','allisw99','btaylor7'等)中提取任何和所有(可能是沒有,可能是3或4).zip文件, 'aforker','allisw99','btaylor7'等),而'導航'即不會掛在可能.pdf或docx文件,可能或不可能駐留在唯一文件夾中('aforker','allisw99', 'btaylor7'等)

這就是我到目前爲止:(和它'工作')(我會修改緯度呃,這樣我就不需要硬編碼的原始zip文件(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程序中運行以下:

'>>> ================================ 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/' 

先感謝您的任何和所有輸入!

格雷格

回答

1

隨着幫助nnoenneo(其他回答者高於或低於)彼得·奧滕,&奧斯卡本傑明(在不同的(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' 行: ​​

,然後在ArcGIS中該工具的屬性瀏覽到包含上面代碼的.py文件。

特別感謝來自python.org的Peter Otten和Oscar Benjamin自2012年8月7日以來一直幫助我解決這個問題!

Regards, Greg

+0

注意:惡意創建(或無知)zip壓縮文件可以覆蓋'outDir'之外的文件。檢查「item」不是絕對路徑,或者其中沒有「..」。 – jfs

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

謝謝您的提示! –