Development Tip

URL에서 반환 된 Zip 파일 다운로드

yourdevel 2021. 1. 9. 10:59
반응형

URL에서 반환 된 Zip 파일 다운로드


웹 브라우저에 제출할 때 zip 파일을 저장하는 대화 상자를 표시하는 URL이있는 경우 Python에서이 zip 파일을 찾아 다운로드하려면 어떻게해야합니까?


사용 urllib2.urlopen. 반환 값은 read()전달할 수있는 파일 류 객체입니다 zipfile.


내가 말할 수있는 한,이를 수행하는 적절한 방법은 다음과 같습니다.

import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()

물론 GET이 r.ok.

Python 3+의 경우 io 모듈로 StringIO 모듈을 하위로 지정하고 StringIO 대신 BytesIO를 사용합니다. 다음 은이 변경 사항을 언급하는 릴리스 노트입니다.

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()

Python 3에서 작업해야 할 작업은 다음과 같습니다.

import zipfile, urllib.request, shutil

url = 'http://www....myzipfile.zip'
file_name = 'myzip.zip'

with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)
    with zipfile.ZipFile(file_name) as zf:
        zf.extractall()

의 도움으로 이 블로그 게시물 , 난 그냥 작업을 있어요 requests. 이상한 stream점은 content큰 요청 을 호출 할 필요가 없기 때문에 한 번에 모두 처리되어 메모리를 막아야한다는 것입니다. stream한 번에 한 청크 데이터를 반복하여이를 방지합니다.

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'

response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
    if chunk:  # filter out keep-alive new chunks
        handle.write(chunk)
handle.close()

urllib2.urlopen을 사용하거나 우수한 Requests모듈을 사용하여 urllib2 두통을 피할 수 있습니다.

import requests
results = requests.get('url')
#pass results.content onto secondary processing...

Thanks to @yoavram for the above solution, my url path linked to a zipped folder, and encounter an error of BADZipfile (file is not a zip file), and it was strange if I tried several times it retrieve the url and unzipped it all of sudden so I amend the solution a little bit. using the is_zipfile method as per here

r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
    r = requests.get(url, stream =True)
    check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
    z = zipfile.ZipFile(io.BytesIO(r.content))
    z.extractall()

I came here searching how to save a .bzip2 file. Let me paste the code for others who might come looking for this.

url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"

response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
   f.write(response.content)

I just wanted to save the file as is.

ReferenceURL : https://stackoverflow.com/questions/9419162/download-returned-zip-file-from-url

반응형