Client-Fortschrittsanzeige bei Web-Download

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
achim
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2006, 18:48

Hallo Liebe Community,

Ich habe ein Problem, bei dem ich einfach nicht weiterkomme. Vielleicht kennt jemand eine Lösung:

Ich schreibe gerade ein Python-Programm, das Daten von einem Webserver holt, indem es ein PHP-Skript aufruft, das Daten aus einer Datenbank liest und als Text ausgibt, in dem jeder Datensatz einer Zeile entspricht.

Ich mache das über die HTTPSConnection der httplib und erzeuge dann das HTTPResponse-Objekt über die Methode getresponse(). Anschliessend schreibe ich die Daten dann mit read() in eine Liste. Das funktioniert soweit auch problemlos. Die Übertragung kann bei entsprechend vielen Datensätzen auch schon mal ein paar Sekunden dauern.

Ich hätte nun gerne eine Fortschrittssanzeige, die in Abhängigkeit von den bereits übertragenen Datensätzen (also Zeilen) anzeigt, wie lange die Übertragung noch dauert. Im Prinzip ganz genauso wie der Gauge beim Intenet-Explorer im Statusbar.

Die Methode HTTPResponse.read() liest aber alle Datensätze auf einmal, man hat keine Möglichkeit, Zeile für Zeile einzulesen, wodurch ein entsprechendes Verhalten über eine Schleife leicht zu implementieren wäre.

Geht das mit diesen Objekten und Methoden überhaupt so, wie ich mir das vorstelle, oder muss man da eher auf "niedrigere" Netzwerkfunktionen zurückgreifen?

Freue mich auf Eure Antworten
Achim
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

1.) nimm die urllib.
2.) entweder immer x bytes lesen und dann den balken bewegen oder thread für den download aufmachen.
TUFKAB – the user formerly known as blackbird
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Mal n kleines Beispiel:

Code: Alles auswählen

import urllib2

url = urllib2.urlopen("http://wasweißich.py")
downloaded = 0
ausgabe = ""
while True:
    buf = url.read(1024)
    if not buf:
        break
    downloaded += len(buf)
    ausgabe += buf
Da hast du in downloaded immer die Anzahl der Bytes die schon geladen wurden, und in ausgabe das geladene.

pythonist
achim
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2006, 18:48

Danke, werd ich ausprobieren...

...

Ok, ich glaube, damit kann ich was anfangen

Danke
Achim
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

schau dir mal folgendes an:

http://www.python-forum.de/topic-3061.html
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Und noch ein weiteres Programm als Anschauungsobjekt.
Antworten