0

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

  1. 将单个原始 zipfile (in_Zip) 解压缩到 zipfile 当前所在文件夹的内容。
  2. 转到步骤 1 产生的唯一(非压缩)文件夹(实际上是学生用户名“aforker”、“allisw99”、“btaylor7”等)。(这些唯一的学生文件夹中可能有 1 到 40 个)
  3. 在每个唯一文件夹('aforker'、'allisw99'、'btaylor7' 等)中提取任何和所有(可以是无,可以是 3 或 4 个).zip 文件到它们相对的上述唯一文件夹('aforker', 'allisw99'、'btaylor7' 等),而 'navigating' 即不会挂断可能存在或不存在于唯一文件夹中的可能的 .pdf 或 docx 文件('aforker'、'allisw99'、'btaylor7'、 ETC)

到目前为止,这是我所拥有的:(并且它“有效”)(稍后我将进行修改,这样我就不需要对原始 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”等中的所有 zip。

我在其他论坛/列表服务上提出了一些建议,但它们都涉及破坏我当前的代码并在 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/'

提前感谢您的任何和所有输入!

格雷格

4

2 回答 2

2

在 nnoenneo(上面或下面的另一个回答者)Peter Otten 和 Oscar Benjamin(在另一个 (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包含上述代码的文件。

特别感谢 python.org 上的 Peter Otten 和 Oscar Benjamin,他们自 2012 年 8 月 7 日以来一直在帮助我度过这个难关!

问候,格雷格

于 2012-09-25T15:04:55.600 回答
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()
于 2012-09-23T02:30:15.857 回答