URL에서 반환된 Zip 파일 다운로드
웹 브라우저에서 제출할 때 zip 파일을 저장하기 위해 대화 상자가 나타나는 URL이 있으면 파이썬에서 이 zip 파일을 어떻게 캡처하고 다운로드할 수 있습니까?
제가 알기로는, 이를 위한 적절한 방법은 다음과 같습니다.
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 모듈이 포함된 IO 모듈 및 바이트 사용문자열 대신 IOIO: 다음은 이 변경 사항에 대한 릴리스 정보입니다.
import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")
대부분의 사람들은 사용을 권장합니다.requests
만약 그것이 가능하다면, 그리고.requests
설명서에서는 url에서 원시 데이터를 다운로드하고 저장할 때 이를 권장합니다.
import requests
def download_url(url, save_path, chunk_size=128):
r = requests.get(url, stream=True)
with open(save_path, 'wb') as fd:
for chunk in r.iter_content(chunk_size=chunk_size):
fd.write(chunk)
zip 파일 다운로드 및 저장에 대한 답변이 있기 때문에, zip 파일 읽기에 대한 자세한 내용은 언급하지 않았습니다.가능성을 보려면 아래의 많은 답변 중 하나를 참조하십시오.
어떤 이유로 액세스할 수 없는 경우requests
사용할 수 있습니다.urllib.request
대신.위와 같이 견고하지 않을 수 있습니다.
import urllib.request
def download_url(url, save_path):
with urllib.request.urlopen(url) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())
마지막으로, 만약 당신이 여전히 파이썬 2를 사용하고 있다면, 당신은 사용할 수 있습니다.urllib2.urlopen
.
from contextlib import closing
def download_url(url, save_path):
with closing(urllib2.urlopen(url)) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())
이 블로그 게시물의 도움으로, 저는 단지 그것으로 작동할 수 있습니다.requests
이상한 점은stream
문제는 우리가 전화할 필요가 없다는 것입니다.content
대량의 요청이 있을 경우 한 번에 모두 처리해야 하므로 메모리가 막힙니다.그stream
에서는 데이터를 한 번에 하나의 청크씩 반복하여 이 문제를 방지합니다.
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
response = requests.get(url, stream=True)
with open('alaska.zip', "wb") as f:
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
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()
.zip 파일을 디스크의 위치에 저장하는 초경량 솔루션(Python 3.9 사용):
import requests
url = r'https://linktofile'
output = r'C:\pathtofolder\downloaded_file.zip'
r = requests.get(url)
with open(output, 'wb') as f:
f.write(r.content)
.bzip2 파일을 저장하는 방법을 찾아 왔습니다.이걸 찾으러 오실 분들을 위해 코드를 붙여드리겠습니다.
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)
저는 그냥 파일을 그대로 저장하고 싶었습니다.
urllib2.urlopen을 사용하거나 우수한 모듈을 사용하여 urllib2 두통을 피할 수 있습니다.
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
위 솔루션에 대한 @yoavram 덕분에 제 url 경로가 zip 폴더에 연결되어 BADZip 파일(파일은 zip 파일이 아님)의 오류가 발생하고, 여러 번 시도하다가 갑자기 url을 검색하고 압축을 풀면 이상해서 솔루션을 조금 수정합니다.여기에 따라 is_zipfile 방법을 사용합니다.
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()
사용하다requests, zipfile and io
비단뱀 꾸러미
특수 바이트IO 기능은 압축 해제된 파일을 드라이브에 저장하는 대신 메모리에 보관하는 데 사용됩니다.
import requests
from zipfile import ZipFile
from io import BytesIO
r = requests.get(zip_file_url)
z = ZipFile(BytesIO(r.content))
file = z.extract(a_file_to_extract, path_to_save)
with open(file) as f:
print(f.read())
언급URL : https://stackoverflow.com/questions/9419162/download-returned-zip-file-from-url
'programing' 카테고리의 다른 글
코코아 포드가 설치되지 않았거나 잘못된 상태임 (0) | 2023.07.17 |
---|---|
Rails: 링크(URL)를 검증하는 좋은 방법은 무엇입니까? (0) | 2023.07.17 |
Content-Type 헤더에 관계없이 Python Flask에서 원시 POST 본문 가져오기 (0) | 2023.07.17 |
C 표준 라이브러리의 위치 (0) | 2023.07.17 |
문자열 벡터 입력을 사용하여 dplyr의 여러 열로 그룹화 (0) | 2023.07.17 |