Python: das Herunterladen einer großen Datei auf einen lokalen Pfad und das festlegen von benutzerdefinierten http-Header
Ich bin auf der Suche nach download einer Datei von einem http-url zu einer lokalen Datei. Die Datei ist groß genug, dass ich möchte, um es herunterzuladen, und speichern Sie es Brocken eher als read()
und write()
die gesamte Datei als einen einzigen Riesen-string.
Die Schnittstelle urllib.urlretrieve
ist im wesentlichen, was ich will. Aber, ich kann nicht sehen, ein Weg, um set-request-Header beim Download über urllib.urlretrieve
, das ist etwas, was ich tun muss.
Wenn ich urllib2
, ich kann request-Header über seine Request
Objekt. Allerdings sehe ich nicht ein, eine API in urllib2
zum herunterladen einer Datei direkt auf einem Pfad auf der Festplatte wie urlretrieve
. Es scheint, dass stattdessen werde ich haben, um eine Schleife zur Iteration über die zurückgegebenen Daten in Blöcken, schreiben Sie in einer Datei selbst und überprüfen, wenn wir fertig sind.
Was wäre der beste Weg, um erstellen Sie eine Funktion, die funktioniert wie urllib.urlretrieve
aber ermöglicht request-Header übergeben werden?
- Was ist falsch mit looping über Stücke von Daten zurückgegeben, aus Neugier?
- Wie kann ich wissen, Wann zu beenden? read() gibt den leeren string nicht unbedingt das Ende bedeuten (wie es auch bei Dateien), weil die Daten vielleicht noch rieseln in. Ich kann verlassen sich auf die content-length-header, aber es fühlt sich an wie ein Mechanismus, dies zu tun, sollten Sie bereits irgendwo existieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist der Schaden, der im schreiben eine eigene Funktion mit urllib2?
und mittels des request-Objekt um Header zu setzen
Wenn Sie möchten, verwenden Sie das urllib und urlretrieve, Unterklasse
urllib.URLopener
und seineaddheader()
Methode zum anpassen der Header (sprich:addheader('Accept', 'sound/basic')
, die ich ziehe aus den docstring für das urllib.addheader).Installieren Ihre URLopener für die Verwendung durch das urllib, siehe das Beispiel in der das urllib._urlopener Abschnitt der Dokumente (beachten Sie den Unterstrich):
Jedoch, werden Sie erfreut sein zu hören, wrt Ihr Kommentar auf die Frage, Kommentare, Lesen einen leeren string aus
read()
ist in der Tat das signal zu stoppen. Dies ist, wie urlretrieve behandelt, wenn Sie zu stoppen, zum Beispiel. TCP/IP und sockets abstrahieren, Lesen, blockieren wartet auf weitere Daten, es sei denn, die Verbindung auf dem anderen Ende ist der EOF und geschlossen wird, in dem Fall die read () - von ing-Verbindung wird eine leere Zeichenfolge zurückgegeben. Eine leere Zeichenfolge bedeutet, dass es keine Daten blockweise in... Sie nicht haben, um sorgen über bestellte packet re-Montage so, dass ist alles schon für Sie verarbeitet. Wenn das Ihre Sorge für urllib2, ich denke, Sie können sicher verwenden es.