2013-02-22 57 views
0

我編寫了一個小應用程序,該應用程序通過鏈接提供一個zip文件(具有不同的擴展名),並將文件提取到重命名的文件夾。 出於某種原因,它爲我的一些zip文件工作,但不是爲他們所有。提取一些zip文件的Python錯誤

我得到一個:

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() 

我的工作下載的文件:

蟒蛇download_unzip.py 「http://dl.dropbox.com/u/2971439/dae.kmz

不工作的一個:

蟒蛇download_unzip.py 「http://dl.dropbox.com/u/2971439/rally_car_youbeq.kmz

請注意,這兩個文件與我的OS提取正常(Ubuntu的)

+1

我看到很多東西g與你的代碼。對於初學者來說,'unzip_file()'函數傳遞給zip檔案文件名並嘗試從其中提取_all_文件,但是隻返回第一個文件的名字和最後一個字符被刪除(所以它是無效的,這將導致以下'shutil.move()'調用失敗)。另外,請不要只說一些「不起作用」的東西。至少詳細描述你的問題中發生的任何回溯。基本的想法是幫助我們幫助你。 – martineau 2013-02-23 00:17:41

+0

我拿出最後一個字符,因爲它是「/」,我認爲最好刪除它。反正它不起作用,即使我離開它。關於回溯,如果你看到代碼的第一部分,你會看到它的;) – psychok7 2013-02-25 09:57:35

+0

我只是解壓縮文件,並使用路徑來閱讀文件夾,如果你需要幫助路徑點擊這裏>>> http: //stackoverflow.com/questions/3701646/how-to-add-to-the-pythonpath-in-windows-7 <<< – Jordanian 2013-12-17 19:30:01

回答

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()