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

Platzierung von print

Beitragvon fab » Mittwoch 13. Juni 2007, 23:28

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

Beitragvon querdenker » Donnerstag 14. Juni 2007, 06:39

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:

Beitragvon EnTeQuAk » Donnerstag 14. Juni 2007, 07:05

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

Beitragvon fab » Donnerstag 14. Juni 2007, 08:52

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:

Beitragvon EnTeQuAk » Donnerstag 14. Juni 2007, 09:06

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

Beitragvon pyStyler » Donnerstag 14. Juni 2007, 10:18

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

Beitragvon fab » Donnerstag 14. Juni 2007, 10:49

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

Beitragvon lunar » Donnerstag 14. Juni 2007, 11:02

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

Beitragvon fab » Dienstag 19. Juni 2007, 11:47

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]