我必须使用Python 2.6! 这是一项我真正想要自动化的任务,情况是静态的,一旦我创建了这个,我就会变得很好(好)。 我必须创建一个独立的脚本(在Idle,我希望),它将:
这是我到目前为止所做的:(并且它“有效”)(我稍后会修改,以便我不需要对原始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/'
提前感谢所有输入!
格雷格
答案 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()