Seite 1 von 1

ungewolltes NewLine Zeichen

Verfasst: Samstag 23. Mai 2009, 14:09
von Maenny
Hallo zusammen,

Ich bin gerade dabei ein CGI-Script zu schreiben und bin dabei auf ein Problem gestoßen, welches ich nach einigen STunden und etlichen Recherchevorgängen nicht lösen konnte. Im Prinzip ist alles erstmal ganz einfach: Ich gebe einen HTML text heraus, bei dem ich dynamisch einige Variablen einsetze. Im Endeffekt sieht das dann etwa so aus, nur eben mit richtigem html Code und um Einiges komplexer:

Code: Alles auswählen


print """Hier kommt HTML Code mit einigen %(platzhalter)s die ich einfügen will.""" % {'platzhalter':'Sachen'}


Ich habe nun in dem Dictionary mehrere Variablen, die ich davor über eine Datei eingelesen habe:

Code: Alles auswählen


txtFile=file('meine Datei','r')
infoList=txtFile.readlines()

Diese Liste infoList setze ich mit infoList[0], infoList[1] etc in den Html-String ein. So und nun das Problem: Anscheinend haben die Werte infoList[0] etc am Ende (wahrscheinlich wg readline()) einen '\n' eingefügt, denn im resultierenden HTML Text wird immer nach dem Einsetzen der Variable eine neue Seite angefangen. Also habe ich folgendes gemacht:

Code: Alles auswählen


infoList[0]=infoList[0].replace('\n','')
infoList[1]=infoList[1].replace('\n','')
infoList[2]=infoList[2].replace('\n','')
# etc.

Nur das Problem ist, dass das nix bringt, der Zeilenumbruch bleibt bestehen. Ich habe dann zufällig in einer Fehlermeldung gesehen, das PYthon die Variablen folgendermaßen angibt:

'Uploader'='Value\r'

Ich vermute also, dass es irgendwas mit raw-strings zu tun hat, allerdings, wenn ich mir die Variablen nach dem replace-Befehl als Raw ausgeben lasse, findet sich kein \n in den strings.

Hat irgendjemand eine Idee, wie ich verhindern kann, dass jedesmal beim einsetzen einer Variable ein Zeilenumbruch hinzugefügt wird? Überigens, wenn ich die Werte mit int(value) einsetze, bleibt der Zeilenumbruch aus, es scheint also nur bei strings aufzutauchen.

Danke für Hilfe,

Maenny

Verfasst: Samstag 23. Mai 2009, 14:32
von BlackJack
Wenn Du grundsätzlich "whitespace"-Zeichen am Zeilenende entfernen kannst, dann wäre das wohl die beste Lösung. Und das mit den Indizes 0, 1, 2 usw. per Hand da hinschreiben, machst Du doch hoffentlich nicht wirklich!? Für so etwas wurden Schleifen erfunden.

Code: Alles auswählen

text_file = open('meine Datei')
infos = [line.rstrip() for line in text_file]
text_file.close()

Verfasst: Samstag 23. Mai 2009, 18:19
von Maenny
Super danke, das funzt. Verstanden habe ich es allerdings noch nicht:

Wieso produziert ein WhiteSpace einen Zeilenumbruch bei print?
Und wieso funktioniert es nicht mit string.replace('\n','')?

Danke jedenfalls für die schnelle Hilfe,

Maenny

Verfasst: Samstag 23. Mai 2009, 18:41
von BlackJack
Es gibt nicht *das* "whitespace"-Zeichen -- "whitespace" bezeichnet alle Zeichen die beim Drucken keine Tinte bzw. keinen Toner verbrauchen, also auch der Wagenrücklauf und der Zeilenvorschub.

Dein `replace()` ersetzt halt nur das '\n' aber kein '\r'. Das ist aber ganz offensichtlich auch in Deiner Datei enthalten. Ist wahrscheinlich in Windows geschrieben worden.

Verfasst: Sonntag 24. Mai 2009, 09:34
von sma
<klugscheißer>Das ungewollte Zeichen ist übrigens nicht Newline (NL) (Zeilenvorschub) sondern Carriage Return (CR) (Wagenrücklauf).</klugscheißer>

Stefan

Verfasst: Sonntag 24. Mai 2009, 11:43
von Y0Gi
Lass doch mal den Inhalt der einzulesenden Datei zeilenweise mit `print repr(line)` in einem separaten lokalen Script auf der Kommandozeile, ins Logfile oder innerhalb von `<pre>...</pre>` in der HTML-Ausgabe anzeigen. Dort solltest du `\r\n` als Zeilenende finden - und das ersetzt dein Replace-Ausdruck nicht vollständig.

Verfasst: Sonntag 24. Mai 2009, 13:44
von Maenny
Mhm mhm...

Ich kannte das \r Zeichen noch nicht. Und das tauchte auch irgendwie nicht im raw-string auf. Aber jetzt weiß ichs ja :-) Danke jedenfalls.

Maenny