ungewolltes NewLine Zeichen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Maenny
User
Beiträge: 17
Registriert: Samstag 23. Mai 2009, 13:52
Kontaktdaten:

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
www.framefloor.de
www.manuleum.com
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()
Maenny
User
Beiträge: 17
Registriert: Samstag 23. Mai 2009, 13:52
Kontaktdaten:

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
www.framefloor.de
www.manuleum.com
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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

<klugscheißer>Das ungewollte Zeichen ist übrigens nicht Newline (NL) (Zeilenvorschub) sondern Carriage Return (CR) (Wagenrücklauf).</klugscheißer>

Stefan
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Maenny
User
Beiträge: 17
Registriert: Samstag 23. Mai 2009, 13:52
Kontaktdaten:

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
www.framefloor.de
www.manuleum.com
Antworten