2012-09-21 53 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

谢谢您的提示! –