Seite 1 von 1

Platzierung von print

Verfasst: Mittwoch 13. Juni 2007, 23:28
von fab
Hallo zusammen

Dieser Teil eines Skripts liest von einer Webseite alle rsync-Server aus und schreibt sie in eine Datei.

Code: Alles auswählen

import socket, urllib

print "Write Mirror data to file...",

# Get rsync servers

for line in urllib.urlopen("http://mirrors.fedoraproject.org/publiclist").readlines():
	if not line.startswith('<td><span><a href="rsync:'):
		continue
	start = line.index("<", 9)+9
	ende = line.index(">", start)-1
	data = line[start:ende]  

# Write to file

	out_file = open('mirrors.txt', 'a')
	out_file.write(data+"\n")
	out_file.close()
print "OK"
So weit so gut, es funktioniert (Die Daten werden in die Datei geschrieben). Ich habe aber noch einen kleinen Schönheitsfehler drin. Es sollte während der Laufzeit so aussehen:

Code: Alles auswählen

Write Mirror data to file...
damit der Benutzer sehen kann die Daten holt, resp. geschrieben werden...und wenn es fertig noch das "OK"

Code: Alles auswählen

Write Mirror data to file... OK
Der Schreibvorgang in die Datei wiederholt sich diverese Male, so kann ich den ersten print-Ausdruck nicht vor das Schreiben in die Datei platzieren (er erscheint sonst für jede Zeile, die in die Datei geschrieben wird) und wenn ich ihn noch weiter vorne platziere wie im Code-Bereich oben, dann erscheint alles zusammen vor dem Ende des Skripts. Könnte mir bitte jemand einen Tipp zum Platzieren der print-Anweisung geben? Denn langsam gehen mir die Varianten aus (eventuell gibt es auch keine funktionierende).

Danke für alle Hinweise.

Gruss Fabian

Verfasst: Donnerstag 14. Juni 2007, 06:39
von querdenker

Code: Alles auswählen

import socket, urllib

print "Write Mirror data to file...",
out_file = open('mirrors.txt', 'a')

# Get rsync servers

for line in urllib.urlopen("http://mirrors.fedoraproject.org/publiclist").readlines():
    if not line.startswith('<td><span><a href="rsync:'):
        continue
    start = line.index("<", 9)+9
    ende = line.index(">", start)-1
    data = line[start:ende] 

# Write to file
    out_file.write(data+"\n")

out_file.close()
print "OK" 
hth

Verfasst: Donnerstag 14. Juni 2007, 07:05
von EnTeQuAk
Und wenn du auf den automatischen Zeilenumbruch von 'print' verzichten möchtest:

Code: Alles auswählen

>>> sys.stdout.write("Write Mirror data to file..."); sys.stdout.write(" OK\n")
Write Mirror data to file... OK
sys.stdout.write macht diese Umbrüche nicht automatisch.


MfG EnTeQuAk

Verfasst: Donnerstag 14. Juni 2007, 08:52
von fab
Vielen Dank Euch beiden für die Hilfe.

@ EnTeQuAk

Noch etwas zum meinem Verständnis...der automatische Zeilenumbruch wird ja auch mit dem Komma nach der print-Anweisung verhindert. So scheint der das Einfügen von Umbrüchen bei sys.stdout.write gerade umgekehrt zu print zu sein.

Gruss Fabian

Verfasst: Donnerstag 14. Juni 2007, 09:06
von EnTeQuAk
fab hat geschrieben: Noch etwas zum meinem Verständnis...der automatische Zeilenumbruch wird ja auch mit dem Komma nach der print-Anweisung verhindert.
Richtig.
fab hat geschrieben:So scheint der das Einfügen von Umbrüchen bei sys.stdout.write gerade umgekehrt zu print zu sein.
Wie umgekehrt?

Bei sys.stdout.write schreibst du direkt in den Ausgabestream, und sämtliche Zeichen die du eingist, werden ausgegeben, nicht mehr, nicht weniger.

Code: Alles auswählen

print "ich bin ein Text"
fügt automatisch einen Zeilenumbruch hinten an.

Code: Alles auswählen

print "ich bin Text",
tut dies nicht, fügt aber AFAIK noch ein Leerzeichen an den String an. (deshalb werden bei '' print var1, var2 '' beide Variablen von einem Leerzeichen getrennt.)


Das ist alles. Du kannst einsetzen, was du magst. Aber print mit dem Komma ist ebenfalls möglich.


MfG EnTeQuAK

Verfasst: Donnerstag 14. Juni 2007, 10:18
von pyStyler
Hi,

oder mit der funktion( Methode)closed testen ob die datei geschlossen ist.

Code: Alles auswählen

import socket, urllib

#print "Write Mirror data to file...",

# Get rsync servers

for line in urllib.urlopen("http://mirrors.fedoraproject.org/publiclist").readlines():
    if not line.startswith('<td><span><a href="rsync:'):
        continue
    start = line.index("<", 9)+9
    ende = line.index(">", start)-1
    data = line[start:ende] 
    
# Write to file
    out_file = open('mirrors.txt', 'a')
    out_file.write(data+"\n")
    print "Write Mirror data to file...", data
    out_file.close()
    
if out_file.closed:
    print "\n\nOK"
hab es leider nicht testen können.....

Gruss
pyStyler

Verfasst: Donnerstag 14. Juni 2007, 10:49
von fab
Der Ansatz von pyStyler finde ich sehr interessant. Diesen werde ich garantiert zu einem späteren Zeitpunkt einmal verwenden können, aber momentan entspricht es so meinen Vorstellungen und es genügt auch.

Code: Alles auswählen

import socket, urllib

print "Write Mirror data to file...",

# Get rsync servers
for line in urllib.urlopen("http://mirrors.fedoraproject.org/publiclist").readlines():
    if not line.startswith('<td><span><a href="rsync:'):
        continue
    start = line.index("<", 9)+9
    ende = line.index(">", start)-1
    data = line[start:ende]
   
# Write to file
    out_file = open('mirrors.txt', 'a')
    out_file.write(data+"\n")
    out_file.close()
   
if out_file.closed:
    print "OK"
@ EnTeQuAk
print macht automatisch einen Zeilenumbruch (ohne Komma), sys.stdout.write nicht. Dies habe ich mit umgekehrt gemeint.

Gruss Fabian

Verfasst: Donnerstag 14. Juni 2007, 11:02
von lunar
Mal was ganz anderes: Du parst da ja eine Website, so wie ich das sehe... Hast du mal versucht, BeautifulSoup dafür einzusetzen?

Verfasst: Dienstag 19. Juni 2007, 11:47
von fab
Nein, habe ich nicht. Auch weil ich es nicht kannte...Ich denke, da die Struktur der Seite, welche ich will, relative einfach gehalten ist, genügt mein System. Wenn man es aber mit umfangreicheren Seiten machen will, dann ist BeautifulSoup wahrscheinlich zu bevorzugen.

Gruss Fabian