web-dev-qa-db-de.com

Übertragen Sie große Binärdateien mit urllib2 in eine Datei

Ich verwende den folgenden Code, um große Dateien aus dem Internet in eine lokale Datei zu streamen:

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

Dies funktioniert, aber es wird nur sehr langsam heruntergeladen. Gibt es einen schnelleren Weg? (Die Dateien sind groß, daher möchte ich sie nicht im Speicher behalten.)

53
hoju

Kein Grund, Zeile für Zeile zu arbeiten (kleine Stücke AND erfordert Python, um die Zeilenenden für Sie zu finden! -), sondern zerlegen Sie sie einfach in größere Stücke, z.

# 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)

Experimentieren Sie ein wenig mit verschiedenen CHUNK-Größen, um den "Sweet Spot" für Ihre Anforderungen zu finden.

105
Alex Martelli

Sie können auch shutil verwenden:

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)
64
Tiago

Früher habe ich das mechanize -Modul und dessen Browser.retrieve () -Methode verwendet. In der Vergangenheit hat es 100% CPU gekostet und die Dinge sehr langsam heruntergeladen, aber eine neuere Version hat diesen Fehler behoben und funktioniert sehr schnell.

Beispiel:

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 basiert auf urllib2, also kann urllib2 auch eine ähnliche Methode haben ... aber ich kann jetzt keine finden.

6
liori

Sie können urllib.retrieve () zum Herunterladen von Dateien verwenden:

Beispiel:

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")
4
Aravindh