\n -> Syntax Fehler od. norm. String

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
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Hi, absoluter Python-Newbie hier.

Ich nutze OS X 10.4 und Python 2.7.3

Ich versuche gerade mich in der Programmiersprache zurechtzufinden und habe bislang einige Lektionen von http://learnpythonthehardway.org/ durchgearbeitet.
Für Anfänger wie mich ist das wie ich finde ein tolles Tutorial, jedenfalls fand ich die ersten 8 Lektionen super einfach und verständlich und alles hat durchgehend optimal geklappt.

Bei Lektion 9 fängt aber mit steigendem Schwierigkeitsgrad die Crux so langsam an und ich hoffe, dass ich mit diesem Beitrag nicht sofort mit dem ersten Post gleich jemandem auf die Nerven gehe. Folgender Code:
days = "Mon Tue Wed Thu Fri Sat Sun"
months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"

print "Here are the days: ", days
print "Here are the months: ", months
Laut Tutorial soll dieser Code folgende Ausgabe erzeugen:
Here are the days: Mon Tue Wed Thu Fri Sat Sun
Here are the months: Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Aber bei mir werden einfach zwei Strings erzeugt, die genau aussehen wie im Code.
Nach ca. einer Stunde Recherche im Netz und diversen Experimenten habe ich keine Lösung gefunden.
Es verhält sich bei mir so, dass JEDE ”\-Funktion" (t'schuldigung, wenn ich das falsche Wort verwendet haben sollte)
entweder einen Fehler verursacht oder als normaler String eingelesen wird. Allerdings macht Python in manchen Fällen aus 1x "\" -> "\\" in der Fehlermeldung.

Ich habe gelesen, dass je nach System unterschiedliche Syntax gilt, also hab ich Slash, Backslash, mit n, mit r, sowie \r\n und \n\r alles durchprobiert.
Nichts lief. An diesem Punkt bin ich langsam ratlos, da eine exakte Befolgung des Tutorials ebensowenig geholfen hat wie die Experimente mit möglicherweise alternierender Syntax.

Suchfunktion hier im Forum ergab für meine Anfragen 0 Ergebnisse, wenn es an meinem schlichtweg zu bescheidenen Wissen liegt, dass ich die richtigen Suchworte nicht verwendet habe, dann ein dickes Sorry von mir. Ich hoffe ihr könnt mir auf die Sprünge helfen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo mamba, willkommen im Forum,

Freut mich, dass du Python lernen willst und dass du initiative zeigst, Probleme selbst zu lösen. Das ist ein wichtiger Punkt beim lernen vom Programmieren.
mamba hat geschrieben:Aber bei mir werden einfach zwei Strings erzeugt, die genau aussehen wie im Code.
Nach ca. einer Stunde Recherche im Netz und diversen Experimenten habe ich keine Lösung gefunden.
Es verhält sich bei mir so, dass JEDE ”\-Funktion" (t'schuldigung, wenn ich das falsche Wort verwendet haben sollte)
entweder einen Fehler verursacht oder als normaler String eingelesen wird. Allerdings macht Python in manchen Fällen aus 1x "\" -> "\\" in der Fehlermeldung.
In der Fehlermeldung? Ich denke es wäre doch hilfreich wenn du uns die Fehlermeldung & deinen Code zeigen würdes.
mamba hat geschrieben:Ich habe gelesen, dass je nach System unterschiedliche Syntax gilt, also hab ich Slash, Backslash, mit n, mit r, sowie \r\n und \n\r alles durchprobiert.
Das ist Quatsch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@mamba: Wenn ich mal raten darf hast Du um alles nach der ``print``-Anweisung Klammern gesetzt. ``print`` ist (in Python 2.x) *keine* Funktion, also erzeugst Du mit den Klammern ein Tupel mit zwei Zeichenketten darin. Und wenn man Tupel mit ``print`` ausgibt, werden sie in eine Zeichenkettendarstellung umgewandelt in dem jedes Element in dem Tupel seinerseits in eine Zeichenkettendarstellung umgewandelt wird. Und zwar mit der `repr()`-Funktion. Schau mal dort in der Dokumentation nach. Kleines interaktives Experiment:

Code: Alles auswählen

In [250]: s = 'one\ntwo'

In [251]: print 'test:', s
test: one
two

In [252]: print ('test:', s) # <- a tuple!
('test:', 'one\ntwo')

In [253]: print s
one
two

In [254]: print repr(s)
'one\ntwo'
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Der Code, so im ersten Zitat stehend, erzeugt auch genau die Ausgabe wie im zweiten Zitat, wenn man ihn in eine Datei schreibt und diese dann mit Python 2.7 ausführt. Was für eine Entwicklungsumgebung benutzt du und wie führst du den Code aus?

Wenn ich's in ein TextMate-Fenster kopiere und ⌘R drücke, kommt das richtige Ergebnis.

Das "\" in einem String würde ich übrigens Escape-Zeichen nennen. Eine Funktion meint etwas anderes. Es gilt auch nicht je nach System eine unterschiedlich Syntax, sondern traditionell haben Betriebssysteme unterschiedliche Konventionen, wie das Ende einer Zeile markiert wird. Beim alten Mac OS war es mal einfach nur Carriage Return (Wagenrücklauf) a.k.a ASCII 13, a.k.a CR a.k.a. U+000D a.k.a \r. Unix (und das aktuelle OS X) nutzen Line Feed (Zeilenvorschub) ASCII 10, a.k.a LF a.k.a U+000A a.k.a. \n. DOS und Windows nutzen beides. Python vereinheitlicht dies beim Einlesen einer Textdatei zu \n.

Stefan
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Mein Code sieht so aus an (danach kommt nur noch eine Print-Anweisung über mehrere Zeilen mit dreifachen Anführungszeichen:
days = "Mon Tue Wed Thu Fri Sat Sun"
#NOTE: \n doesn't seem to work!
months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"

print "Here are the days: ", days
print "Here are the months: ", months
Dann führe ich das Script im Terminal aus - Ausgabe:
mymac:~/mystuff me$ python ex9.py
Here are the days: Mon Tue Wed Thu Fri Sat Sun
Here are the months: Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug
Eine konkrete Fehlermeldung bekomme ich in diesem Fall nun noch überhaupt nicht. Das Escape-Zeichen wird einfach als Teil des Strings eingelesen,
genau wie alle Quatsch-Kombinationen, die ich ausprobiert habe.

Eine Fehlermeldung bekomme ich in Übung 10 bei folgendem Code:
print "I am 6'2\" tall." #escape double-quote inside string
print 'I am 6\'2" tall.' #escape single-quote inside string

tabby_cat = "\tI'm tabbed in."
persian_cat = "I'm split \non a line."
backslash_cat = "I'm \\ a \\ cat."

fat_cat = """
I'll do a list:
\t* Cat food
\t* Fishies
\t* Catnip\n\t* Grass
"""

print tabby_cat
print persian_cat
print backslash_cat
print fat_cat
Terminal-Ausgabe:
mymac:~/mystuff me$ python ex10.py
File "ex10.py", line 1
print "I am 6'2\\" tall." #escape double-quote inside string
^
SyntaxError: invalid syntax
Die Fehlermeldung kann ich umgehen, wenn ich die ersten beiden Zeilen mit einem # auskommentiere.
Dann zeigt er den restlichen Code wieder so an, als sei das Escape-Zeichen einfach nur ein Teil des Strings:
mymac:~/mystuff me$ python ex10.py
\tI'm tabbed in.
I'm split \non a line.
I'm \\ a \\ cat.

I'll do a list:
\t* Cat food
\t* Fishies
\t* Catnip\n\t* Grass
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Der Code, so im ersten Zitat stehend, erzeugt auch genau die Ausgabe wie im zweiten Zitat, wenn man ihn in eine Datei schreibt und diese dann mit Python 2.7 ausführt. Was für eine Entwicklungsumgebung benutzt du und wie führst du den Code aus?
Also ich schreib einfach Dateien mit Smultron, nenn die Dinger exNr.py und führ sie in der Shell aus wie einen Beitrag weiter oben beschrieben.

Und wie gesagt: OS X 10.4, Python 2.7.3 - Das Tutorial ist für Python 2.5 geschrieben, d.h. zu alt sind meine Versionen jedenfalls nicht. Ich hatte auch zuerst
Python 2.5 - als dann die Probleme auftauchten hab ich ein Update gemacht auf Python 2.7.3, weil der Autor Version 2.5.1 verwendet hat und ich nicht sicher war,
ob meine Version 2.5 nun 100 % kompatibel ist.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Du machst etwas sehr Komisches.

Probiere dies: Öffne ein Terminal. Starte Python. Gehe dann zu deinem ersten Beitrag, markiere das erste Zitat, kopiere es und paste es dann in das Terminal mit dem laufenden Python. Drücke ggf. noch einmal RETURN und du solltest sehen, was du im zweiten Zitat schreibst. Ich habe hier zwar OS X 10.7 und nicht 10.4, aber auch Python 2.7.3 (was zu 2.5 aufwärtskompatibel ist) und \n tat und tut schon immer, was es sollte.

Stefan
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Stefan:

Das hat's gebracht! Auf die Art und Weise funktioniert es tatsächlich.

Jetzt verstehe ich nur noch nicht ganz, warum mein *.py-Script, wenn ich es so wie gehabt ausführe,
grundsätzlich bis auf diesen einen kleinen Punkt funktioniert.

Ich verstehe noch nicht ganz, was an dieser Vorgehensweise anders ist, da ich davon ausgegangen bin,
dass ich im Terminal mit dem Befehl
python ex9.py
im Grunde ja das Gleiche mache, also Python ausführen und dann den enthaltenen Sourcecode von Python
ausführen lassen.
BlackJack

@mamba: Das stimmt. Und das Phänomen was Du beschreibst dürfte eigentlich auch gar nicht auftreten. Ich weiss nicht wie weit die üblichen Unix-Werkzeuge unter MacOS zur Verfügung stehen, aber kannst Du mal zeigen was bei ``cat ex9.py`` ausgegeben wird!?
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Dann gibt er mir das aus:
mymac:~/mystuff me$ cat ex9.py
#Here's some new strange stuff, remember type it exactly.

days = "Mon Tue Wed Thu Fri Sat Sun"
#NOTE: \\n doesn't seem to work!
months = "Jan\\nFeb\\nMar\\nApr\\nMay\\nJun\\nJul\\nAug"
BlackJack

@mamba: Tja, da hast Du ja auch überall *doppelte* Backslashes im Quelltext stehen. Dann ist es ja kein Wunder, dass Deine Ausgabe so aussieht wie sie aussieht.
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Den Quelltext habe ich ja weiter oben schon gepostet.

Die doppelten Backslashes scheint der automatisch einzufügen.
Ich habe keine Ahnung wieso der das macht.
BlackJack

@mamba: ”Der” wäre dann in diesem Fall Dein Editor. Das ist also kein Python-Problem. :-)
mamba
User
Beiträge: 7
Registriert: Samstag 28. April 2012, 02:12

Du hattest Recht!

In den Einstellungen war die Textcodierung auf ASCII gestellt.
Hab sie auf Unicode (UTF-8) gewechselt und tada...alles funktioniert wie es sollte.

PROBLEM GELÖST! Danke, Leute.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ok, dann werd ich mir Smultron gleich mal als eines der Programme vormerken, von dem ich abraten werde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Wobei sich mir der Zusammenhang zwischen der Kodierung und '\n' nicht wirklich erschliesst‽ Warum sollte ein Editor da Änderungen beim Speichern vornehmen? Das ist doch Problemlos als ASCII darstellbar.
Antworten