Platzierung von print

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

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
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

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
lunar

Mal was ganz anderes: Du parst da ja eine Website, so wie ich das sehe... Hast du mal versucht, BeautifulSoup dafür einzusetzen?
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

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
Antworten