2010-12-09 20 views
4

HI, alle zusammen. Ich bin neu in Python und verwende Python 2.5 auf CentOS.Wie Dateien mit Python herunterladen?

Ich muss Dateien wie WGET herunterladen.

Ich habe einige Suche durchgeführt, und es gibt einige Lösungen, eine offensichtliche Art und Weise, ist dies:

import urllib2 
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3") 
output = open('test.mp3','wb') 
output.write(mp3file.read()) 
output.close() 

Dies funktioniert gut. Aber ich möchte wissen, ob die MP3-Datei sehr groß ist, wie 1 GB, 2 GB oder noch größer. Kann dieses Code-Snippet noch funktionieren? Gibt es bessere Möglichkeiten, große Dateien in Python herunterzuladen, vielleicht mit einem Fortschrittsbalken wie WGET.

Vielen Dank!

+0

ich Ihre Frage annehmen, um iterativ liest und ein Stück zu einer Zeit, zu schreiben, im Gegensatz zu der gesamten Datei in den Speicher einzulesen auf einmal nur alles, um das zu schreiben Festplatte danach. – chrisaycock

+3

möglich Duplikat von [Stream große Binärdateien mit urllib2 in Datei] (http://StackOverflow.com/questions/1517616/stream-large-binary-files-with-urllib2-to-file) – katrielalex

Antwort

15

Es gibt einen einfacheren Weg:

import urllib 
urllib.urlretrieve("http://www.example.com/songs/mp3.mp3", "/home/download/mp3.mp3") 
2

Warum nicht einfach anrufen wget dann?

import os 
os.system ("wget http://www.example.com/songs/mp3.mp3") 
+0

Danke dafür. Ist diese Methode sicher? Scheint ziemlich hohe Chancen, zu einem System Crush zu führen ... weil nur wenige Leute diese Methode benutzen, soweit ich weiß. – DocWiki

+0

Und es scheint keine Möglichkeit zu geben zu wissen, ob die wget-Methode erfolgreich ist oder nicht. Bitte überprüfen Sie diese Seite: 'http: // linux.byexamples.com/archives/366/python-how-to-run-eine-Befehlszeile-innerhalb-python /' – DocWiki

+0

@DocWiki Ich bevorzuge 'curl' selbst zu ' wget'. Systemaufrufe sind jedoch immer eine knifflige Angelegenheit. Ich habe selbst @ Pauls "urlretrieve" -Antwort gewählt. – chrisaycock

3

Für wirklich große Dateien, würde Ihr Code viel Speicher verwenden, da Sie sofort die gesamte Datei in den Speicher laden. Es könnte besser sein, die Daten in Blöcken zu lesen und schreiben:

from __future__ import with_statement 
import urllib2 
mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3") 
with open('test.mp3','wb') as output: 
    while True: 
     buf = mp3file.read(65536) 
     if not buf: 
      break 
     output.write(buf) 
1

Ihr aktueller Code wird den gesamten Strom in dem Speicher lesen, bevor auf der Festplatte zu schreiben. Für Fälle, in denen die Datei größer ist als der verfügbare Speicher, treten Probleme auf.

um dies zu beheben, können Sie Blöcke gleichzeitig lesen und in Datei schreiben.


(kopiert von Stream large binary files with urllib2 to file)

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

"ein wenig mit verschiedenen CHUNK experimentieren Größen, die zu finden "Sweet Spot" für Ihre Anforderungen."

Verwandte Themen