본문 바로가기
Python/Python FAQ

Python 파이썬에서 requests를 사용하여 큰 파일을 다운로드하세요., Download large file in python with requests

by 베타코드 2023. 9. 12.
반응형

질문


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: # 필터링하여 keep-alive 새 청크를 제외합니다.
            f.write(chunk)
    f.close()
    return 

어떤 이유로 인해 이 방식으로는 작동하지 않습니다. 파일이 저장되기 전에 여전히 응답을 메모리에 로드합니다.


답변


다음 스트리밍 코드로 인해 Python 메모리 사용량이 다운로드한 파일의 크기와 관계없이 제한됩니다:

def download_file(url):
    local_filename = url.split('/')[-1]
    # 아래 stream=True 매개변수에 주목하세요
    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): 
                # 만약 청크 인코딩된 응답이 있다면 주석 해제하고
                # chunk_size 매개변수를 None으로 설정하세요.
                #if chunk: 
                f.write(chunk)
    return local_filename

iter_content를 사용하여 반환된 바이트 수는 정확히 chunk_size와 일치하지 않습니다. 이는 종종 훨씬 더 큰 임의의 숫자이며, 각 반복마다 다른 값으로 예상됩니다.

자세한 내용은 body-content-workflowResponse.iter_content를 참조하세요.

반응형

댓글