programing

urllib2를 사용하여 대용량 바이너리 파일을 파일로 스트리밍

copyandpastes 2021. 1. 16. 11:02
반응형

urllib2를 사용하여 대용량 바이너리 파일을 파일로 스트리밍


다음 코드를 사용하여 인터넷의 대용량 파일을 로컬 파일로 스트리밍합니다.

fp = open(file, 'wb')
req = urllib2.urlopen(url)
for line in req:
    fp.write(line)
fp.close()

이것은 작동하지만 매우 느리게 다운로드됩니다. 더 빠른 방법이 있습니까? (파일이 커서 메모리에 보관하고 싶지 않습니다.)


줄 단위로 작업 할 이유가 없습니다 (작은 청크 및 Python이 줄 끝을 찾는 데 필요합니다!-), 더 큰 청크로 청크하십시오. 예 :

# from urllib2 import urlopen # Python 2
from urllib.request import urlopen # Python 3

response = urlopen(url)
CHUNK = 16 * 1024
with open(file, 'wb') as f:
    while True:
        chunk = response.read(CHUNK)
        if not chunk:
            break
        f.write(chunk)

다양한 CHUNK 크기로 약간 실험하여 요구 사항에 맞는 "스위트 스팟"을 찾으십시오.


shutil 을 사용할 수도 있습니다 .

import shutil
try:
    from urllib.request import urlopen # Python 3
except ImportError:
    from urllib2 import urlopen # Python 2

def get_large_file(url, file, length=16*1024):
    req = urlopen(url)
    with open(file, 'wb') as fp:
        shutil.copyfileobj(req, fp, length)

나는 mechanize모듈과 그 Browser.retrieve () 메서드를 사용했습니다. 과거에는 100 % CPU를 사용하고 다운로드 속도가 매우 느 렸지만 최근 릴리스에서는이 버그를 수정하여 매우 빠르게 작동합니다.

예:

import mechanize
browser = mechanize.Browser()
browser.retrieve('http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.32-rc1.tar.bz2', 'Downloads/my-new-kernel.tar.bz2')

Mechanize는 urllib2를 기반으로하므로 urllib2도 비슷한 방법을 가질 수 있지만 지금은 찾을 수 없습니다.


urllib.retrieve ()를 사용하여 파일을 다운로드 할 수 있습니다.

예:

try:
    from urllib import urlretrieve # Python 2

except ImportError:
    from urllib.request import urlretrieve # Python 3

url = "http://www.examplesite.com/myfile"
urlretrieve(url,"./local_file")

참조 URL : https://stackoverflow.com/questions/1517616/stream-large-binary-files-with-urllib2-to-file

반응형