2013-06-01 7 views
12

ich urllib2 bin mit den Daten aus der URL zu lesen, unter dem Codeausschnitt ist:Python las Website-Daten Zeile für Zeile, wenn verfügbar

data = urllib2.urlopen(urllink) 
for lines in data.readlines(): 
    print lines 

URL, die ich öffnen bin, ist eigentlich ein CGI-Skript, das einige tut verarbeitet und druckt die Daten parallel. CGI-Skript dauert etwa 30 Minuten. Mit dem obigen Code konnte ich die Ausgabe erst nach 3o Minuten sehen, wenn die Ausführung des CGI-Skripts abgeschlossen ist.

Wie kann ich die Daten von der URL lesen, sobald sie verfügbar ist und drucken Sie sie aus.

Antwort

21

Gerade Schleife direkt über das Dateiobjekt:

for line in data: 
    print line 

Dieser liest die eingehenden Datenstrom Zeile für Zeile (intern, die Buchse Fileobject .readline() ruft jedes Mal, wenn Sie durchlaufen). Dies setzt voraus, dass Ihr Server so schnell wie möglich Daten sendet.

Aufruf .readlines() (Plural) garantiert, dass Sie die gesamte Anfrage lesen vor Sie Schleife starten, tun Sie das nicht.

Alternativ können Sie die requests library, die für die Anforderung Streaming explizite Unterstützung hat:

import requests 

r = requests.get(url, stream=True) 

for line in r.iter_lines(): 
    if line: print line 

Beachten Sie, dass dies nur funktioniert, wenn der Server startet Streaming-Daten sofort. Wenn Ihr CGI erst Daten produziert, wenn der Prozess abgeschlossen ist, ist es sinnlos, die Daten zu streamen.

+0

Die erste Lösung funktioniert nicht, gibt es eine Lösung, die nur die Standardbibliothek verwendet? – sarbjit

+0

@sarbjit: Ich überprüfte noch einmal; Es gibt keinen Grund für "urllib2" zu blockieren, bis die Anfrage abgeschlossen ist. Ihr Server sendet die Daten einfach nicht, bis das CGI fertig ist. –

+0

@sarbjit: Sie können dies selbst mit 'resp = urllib2.urlopen ('http://vhost2.hansenet.de/10_mb_file.bin')' testen, was sofort zurückkehrt; dann dauert 'for line in resp: pass 'eine Weile, da eine 10 MB große Textdatei mit 1 kb Zeilen heruntergeladen wird. –