0

リンクで提供されたときにzipファイル(拡張子が異なる)をダウンロードし、名前を変更したフォルダーにファイルを抽出する小さなアプリを作成しました。何らかの理由で、一部の zip ファイルでは機能しますが、すべてでは機能しません。

私は得る:

Traceback (most recent call last):
  File "download_unzip.py", line 48, in <module>
    main()
  File "download_unzip.py", line 42, in main
    shutil.move(unzip_file(temp_kmz),'temp_extracted/')
  File "download_unzip.py", line 26, in unzip_file
    fd = open(name, 'w')
IOError: [Errno 2] No such file or directory: 'models/model.dae'

私のコードは次のとおりです。

import sys , urllib , zipfile , os.path , argparse , shutil


parser = argparse.ArgumentParser(description="Download and Unzip")
parser.add_argument('url', help='The action to take (e.g. install, remove, etc.)')
args = parser.parse_args()

print args.url

url = args.url
temp_kmz="temp_kmz"

def unzip_file(path):
    zfile = zipfile.ZipFile(path)
    extracted_filename = zfile.infolist()[0].filename[:-1]

    for name in zfile.namelist():
        (dirname, filename) = os.path.split(name)
        #print "Decompressing " + filename + " on " + dirname
        if filename == '':
            # directory
            if not os.path.exists(dirname):
                os.mkdir(dirname)
        else:
            # file
            fd = open(name, 'w')
            fd.write(zfile.read(name))
            fd.close()
    zfile.close()

    return extracted_filename

def download_file():
    urllib.urlretrieve (url, temp_kmz)
    return True

def main():
    if (download_file()):
        print "Now deleting temp..."
        shutil.rmtree('temp_extracted/')
        print "unzipping.. and renaming folder"
        shutil.move(unzip_file(temp_kmz),'temp_extracted/')
        print "Finished!!"

    else:
        print "Error downloading file"

main()

私の作業用ダウンロードファイル:

python download_unzip.py " http://dl.dropbox.com/u/2971439/dae.kmz "

機能していないもの:

python download_unzip.py " http://dl.dropbox.com/u/2971439/rally_car_youbeq.kmz "

私のOS(Ubuntu)では両方のファイルが適切に抽出されることに注意してください

4

1 に答える 1

0

いくつかの大きなコード変更で私の問題を修正しました:

import urllib2 ,argparse, shutil, urlparse , os , zipfile, os.path
from zipfile import ZipFile as zip

parser = argparse.ArgumentParser(description="Download and Unzip")
parser.add_argument('url', help='The action to take (e.g. install, remove, etc.)')
args = parser.parse_args()

print args.url

url = args.url
temp_kmz="temp_kmz"

def extractAll(zipName):
    z = zip(zipName)
    for f in z.namelist():
        if f.endswith('/'):
            os.makedirs(f)
        else:
            z.extract(f)

def download(url, fileName=None):
    def getFileName(url,openUrl):
        if 'Content-Disposition' in openUrl.info():
            # If the response has Content-Disposition, try to get filename from it
            cd = dict(map(
                lambda x: x.strip().split('=') if '=' in x else (x.strip(),''),
                openUrl.info()['Content-Disposition'].split(';')))
            if 'filename' in cd:
                filename = cd['filename'].strip("\"'")
                if filename: return filename
        # if no filename was found above, parse it out of the final URL.
        return os.path.basename(urlparse.urlsplit(openUrl.url)[2])

    r = urllib2.urlopen(urllib2.Request(url))
    try:
        fileName = fileName or getFileName(url,r)
        with open(fileName, 'wb') as f:
            shutil.copyfileobj(r,f)
    finally:
        r.close()

def main():
    download(url,temp_kmz)
    extractAll(temp_kmz)
main()
于 2013-02-25T11:25:26.950 に答える