2009-11-21 5 views
2

로컬 드라이브에 zip 파일을 다운로드하고 모든 파일을 대상 폴더로 추출하려고합니다.zip 파일을 로컬 드라이브에 다운로드하고 python을 사용하여 대상 폴더에 모든 파일을 추출합니다. 2.5

그래서 해결책을 내놓았지만 파일을 디렉토리에서 다른 디렉토리로 "다운로드"하는 것만으로 파일을 다운로드 할 수는 없습니다. 압축을 풀기 위해 2.6에서 작동하도록 할 수는 있었지만 2.5에서는 작동하지 않았습니다. 그래서 주위에있는 일이나 다른 접근법에 대한 제안을 할 수 있습니다. 사전에 감사합니다.

###################################### 
'''this part works but it is not good for URl links''' 
import shutil 

sourceFile = r"C:\Users\blueman\master\test2.5.zip" 
destDir = r"C:\Users\blueman\user" 
shutil.copy(sourceFile, destDir) 
print "file copied" 
###################################################### 

'''extract works but not good for version 2.5''' 
import zipfile 

GLBzipFilePath =r'C:\Users\blueman\user\test2.5.zip' 
GLBextractDir =r'C:\Users\blueman\user' 

def extract(zipFilePath, extractDir): 
zip = zipfile(zipFilePath) 
zip.extractall(path=extractDir) 
print "it works" 

extract(GLBzipFilePath,GLBextractDir) 

###################################################### 

답변

2

다운로드, URLLIB보고 :

import urllib 
webFile = urllib.urlopen(url) 

압축 해제를 들어, zipfile를 사용합니다. this example을 참조하십시오.

+0

extr 2.5에서 행동하라? – marcus

+0

필자가 링크 한 예제는 새로운 함수 ZipFile.extractall을 사용하지 않으므로 Python 2.5에서 작동 할 것입니다. –

13

urllib.urlretrieve은 URL에서 지정한 경로로 파일 (우편 번호 또는 기타 ;-)를 가져올 수 있습니다.

extractall은 실제로 2.6에서 새로 추가되었지만 2.5에서는 명시 적 루프 (모든 이름 가져 오기, 각 이름 열기 등)를 사용할 수 있습니다. 예제 코드가 필요합니까?

그래서 여기에 일반적인 아이디어가 있습니다. (각 경우마다 좋은 오류 메시지를 제공하려면 더 많은 숫자가 필요합니다. 물론, 백만 가지 종류가 있습니다. 만) ... 예와 같은 경우 몇 가지를 사용하여 :

import os 
import urllib 
import zipfile 

def getunzipped(theurl, thedir): 
    name = os.path.join(thedir, 'temp.zip') 
    try: 
    name, hdrs = urllib.urlretrieve(theurl, name) 
    except IOError, e: 
    print "Can't retrieve %r to %r: %s" % (theurl, thedir, e) 
    return 
    try: 
    z = zipfile.ZipFile(name) 
    except zipfile.error, e: 
    print "Bad zipfile (from %r): %s" % (theurl, e) 
    return 
    for n in z.namelist(): 
    dest = os.path.join(thedir, n) 
    destdir = os.path.dirname(dest) 
    if not os.path.isdir(destdir): 
     os.makedirs(destdir) 
    data = z.read(n) 
    f = open(dest, 'w') 
    f.write(data) 
    f.close() 
    z.close() 
    os.unlink(name) 
+0

예 저는 파이썬으로 초보자입니다. – marcus

+0

주셔서 감사합니다. 얼마 동안 스크립트를 수정하고 돌아 왔습니다. "for n in z.namelist() :"는 모든 파일을 참조합니다. zip 파일 내의 폴더를 압축 해제하고 zip 파일의 파일 구조를 유지 관리 할 수없는 것 같습니다. 다시 한 번 감사드립니다 – marcus

+0

@marcus, 내가 준 코드는 저에게 큰 작품입니다. 왜 당신이 얻는 오류가 정확히 "올릴 수없는 것"이라기보다는 어떤 오류를 게시할까요?! 분명히 아무도 정보없이 당신을 도울 수 없습니다. 방향 및 절차에 대한 –

2

내가 지금까지 발견 한 가장 짧은 방법, ZipFile.extractall() 대신의 + 알렉스 응답을 사용하는 것입니다,하지만 와 루프 :

from zipfile import ZipFile 
from urllib import urlretrieve 
from tempfile import mktemp 

filename = mktemp('.zip') 
destDir = mktemp() 
theurl = 'http://www.example.com/file.zip' 
name, hdrs = urlretrieve(theurl, filename) 
thefile=ZipFile(filename) 
thefile.extractall(destDir) 
thefile.close() 
관련 문제