0

Python 2.6を使用する必要があります!これは私が本当に自動化したいタスクです。状況は静的であり、これを作成すると、私は黄金になります(良い)。次のようなスタンドアロンスクリプトを作成する必要があります(アイドル状態で、私は願っています)。

  1. 単一の元のzipファイル(in_Zip)を、zipファイルが現在存在するフォルダーの内容に解凍します。
  2. 手順1で作成された一意の(非ZIPPED)フォルダー(実際には学生のユーザー名'aforker'、'allisw99'、'btaylor7'など)に移動します(これらの一意の学生フォルダーは1〜40個あります)。
  3. 各一意のフォルダー('aforker'、'allisw99'、'btaylor7'など)内で、関連する前述の一意のフォルダー('aforker'、 'allisw99'、'btaylor7'など)、'navigating'、つまり、一意のフォルダー('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」などのすべてのzipを抽出する方法です。

他のフォーラム/リストサーブについていくつか提案がありましたが、それらはすべて、現在のコードをゴミ箱に移動し、Windowsコマンドウィンドウで何かを行うことなどを含みます。a)それらを機能させることができません。b)機能しません。これをすべて機能させるには、スタンドアロンの.pyファイルが1つ必要なので、本当に役に立ちます。

なんで?あなたが尋ねる?これを使用して、1つのスクリプトを必要とする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(上または下の他の回答者)PeterOttenとOscarBenjamin(別の(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上記のコードを含むファイルを参照します。

2012年8月7日以来、私がこれに苦労するのを助けてくれたpython.orgのPeterOttenとOscarBenjaminに特に感謝します。

よろしく、グレッグ

于 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 に答える