반응형
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
반응형
'programing' 카테고리의 다른 글
Node js에서 response.send와 response.write의 차이점 (0) | 2021.01.17 |
---|---|
vue.js의 부모에서 자식 메서드에 액세스하는 방법 (0) | 2021.01.16 |
픽셀을 sp로 변환 (0) | 2021.01.16 |
기본 유형과 참조 유형의 차이점은 무엇입니까? (0) | 2021.01.16 |
Java 도구를 초기화하는 동안 Eclipse 내부 오류 (0) | 2021.01.16 |