프로그래밍 언어/Python

requests와 함께 파이썬으로 큰 파일 다운로드

Rateye 2021. 12. 1. 09:38
728x90
반응형
질문 : 요청과 함께 파이썬으로 큰 파일 다운로드

Requests 는 정말 멋진 라이브러리입니다. 대용량 파일 (> 1GB)을 다운로드 할 때 사용하고 싶습니다. 문제는 전체 파일을 메모리에 보관할 수 없다는 것입니다. 나는 그것을 덩어리로 읽어야한다. 그리고 이것은 다음 코드의 문제입니다.

import requests

def DownloadFile(url)
    local_filename = url.split('/')[-1]
    r = requests.get(url)
    f = open(local_filename, 'wb')
    for chunk in r.iter_content(chunk_size=512 * 1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
    f.close()
    return

어떤 이유로이 방법은 작동하지 않습니다. 응답을 파일에 저장하기 전에 메모리에로드합니다.

최신 정보

FTP에서 큰 파일을 다운로드 할 수있는 작은 클라이언트 (Python 2.x /3.x)가 필요한 경우 여기에서 찾을 수 있습니다. 멀티 스레딩 및 재 연결 (연결 모니터링)을 지원하며 다운로드 작업을위한 소켓 매개 변수를 조정합니다.

답변

다음 스트리밍 코드를 사용하면 다운로드 한 파일의 크기에 관계없이 Python 메모리 사용량이 제한됩니다.

def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter below
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                # If you have chunk encoded response uncomment if
                # and set chunk_size parameter to None.
                #if chunk: 
                f.write(chunk)
    return local_filename

iter_content 사용하여 반환 된 바이트 수는 chunk_size 가 아닙니다. 종종 훨씬 더 큰 난수 일 것으로 예상되며 반복 할 때마다 다를 것으로 예상됩니다.

추가 참조는 body-content-workflowResponse.iter_content 를 참조하십시오.

출처 : https://stackoverflow.com/questions/16694907/download-large-file-in-python-with-requests
728x90
반응형