ValueError: unsupported format character '<' (0x3c)

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
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Hallo Leute,

das Problem ist ja bekannt, allerdings ist mein Englisch nicht das beste und mein Python noch auf Anfänger Nivaue. Habe gelesen das man unbekannte Zeichen wohl maskieren soll aber mir will die durchfühurung nicht klar werden, bzw. warum man das Zeichen innherhalb eines Strings überhaupt maskieren soll.

Kurz, ich hab keine Ahnung. Es geht dabei um Zeile 8 und um dieses Zeichen < .

Code: Alles auswählen

def py_zuschneiden_html(image, drawable, laden_name, vorwahl, telenr1, telenr2, fax, strasse, hausnr, plz, ort, oeffnen1, oeffnen2,
    oeffnen3, oeffnen4, bestellwert1, ortwert2, bestellwert2, rumpf_daten, html_name,
    kartenname, ordner, spaltenanzahl, logo_ordner, logo_name):
    #
    #HTML erzeugung
    #
    file_name_html = ordner + os.sep + html_name
    titel = "<title>s%-s%-s%-s%-s%-s%-s%-s%</title>" \
    %(laden_name, telenr1, strasse, vorwahl, telenr1, plz, ort, strasse, hausnr)
    file_object_html = open(file_name_html, "w")
    file_object_html.write(titel)
    file_object_html.close
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die Formatierungssequenz fuer einen String ist nunmal "%s" und nicht "s%" ... das geht gut solange nach jeder Sequenz eine weitere kommt .. die letzte Sequenz ist aber "%<" und die ist nunmal ungueltig. Wahrscheinlich wolltest du deine Werte auch mit "-" getrennt ... aber die werden von der Sequenz als Linksausrichtung interpretiert.

http://docs.python.org/2/library/stdtyp ... formatting

Zu den Parametern sag ich mal gar nichts. Du solltest aber wahrscheinlich eine Templating-Engine, wie Jinja2, benutzen.
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Danke cofi,

wenn man den Platzhalter falsch rum schreibt, dann darf Python auch meckern. :)

Das mit Jinja2 behalte ich mal im Hinterkopf, aber wollte jetzt nicht noch ne Baustelle aufmachen.
Und der Teil mit HTML ist sehr übersichtlich.

Gruss,

sinni
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
BlackJack

@Sinnentlehrt: Wenigstens `string.Template` sollte man für so etwas verwenden. Besser aber ein ausgewachsenes Template-System wie Jinja2. Da hat man dann auch gleich Unterstützung beim Escapen von Werten in HTML.

Was bedeutet der `py_`-Präfix beim Funktionsnamen? Funktionsnamen beschreiben üblicherweise auch Tätigkeiten, denn die tun ja etwas.

Die Argumentliste ist arg lang und sieht reichlich ungeordnet aus. Es scheint auch gar nicht alles verwendet zu werden.

Pfade setzt man besser mit `os.path.join()` zusammen.

Da wird eine ziemliche Menge an Information in ein <title>-Tag gepackt. Das dürfte im Fentertitel nur bei sehr breiten Bildschirmen alles rein passen, und die wenigesten Leute werden das dort alles lesen.

Dateien sollte man mit der ``with``-Anweisung verwenden, dann werden sie auch garantiert wieder geschlossen wenn der ``with``-Block verlassen wird. Du schliesst die Datei nicht weil Du die `close()`-Methode vergessen hast *aufzurufen*. Einfach nur referenzieren und dann nichts damit machen reicht nicht.

Edit: Das nennst Du übersichtlich? Abzählen müssen welches '%s' für welchen Wert steht finde ich im Gegenteil ziemlich unübersichtlich.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sinnentlehrt: Und ich möchte nicht derjenige sein, der den Fehler sucht, wenn beim Aufruf Deiner Funktion zwei Parameter vertauscht wurden :cry: . Die Parameter fallen ja auch nicht vom Himmel, sondern stammen wahrscheinlich aus irgendeiner Datenbank. Normalerweise lädt man die dann gleich in eine passende Struktur und reicht nur diese Struktur weiter. Die Parameter »image« und »drawable« lassen befürchten, dass es sich nicht nur um html-Erzeugung handelt. Pack nicht zuviel in eine Funktion, damit sie übersichtlich bleiben.
Und warum kommen Strasse und Telnr1 zweimal im Titel vor??
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Halli hallo,

erstmal Danke für eure Anteilnahme und die guten Tipps.
Zuerst mal Sirius3, was die doppelte Angabe von Variablen angeht, das war einfach Schlampigkeit meinerseits. Habe es dann gleich nach dem richtig schreiben der Platzhalter bemerkt. Und die Ausführung ist natürlich auch mau.

Ich mach das jetzt auch mit Template Strings.

Ähhhm BlackJack, string.Template nehme ich jetzt auch, danke für den Tipp. Die Argumentenliste ist für diesen Abschnitt nicht von Bedeutung, hatte halt keine Lust diese für das Beispiel anzupassen. :roll: (Ja, mache ich das nächste mal.)

os.path.join() übernehme ich dann in mein Skript.
Das mit dem Titel Tag ist so gewollt, an erster Stelle steht die Hauptinfo, also kann diese auch gelesen werden, der Rest ist für die SEO von Google, ob das Hilft? Keine Ahnung, soll aber.

Das mit 'with' ist mir einleuchtend, allerdings kann ich die umsetzung nicht nachvollziehen. Und natürlich 'Uups' das file.close ohne () nicht als Fehler angezeigt wird habe ich natürlich erst jetzt gesehen.

Wäre das die Anwendung von with:

Code: Alles auswählen

with open(file_name_html, "w") as f:
    file_object_html.write(titel)
Und das wars dann?? Ohne irgendwas danach?

Gruss,

sinni
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sinnentlehrt hat geschrieben:Und natürlich 'Uups' das file.close ohne () nicht als Fehler angezeigt wird habe ich natürlich erst jetzt gesehen.
Weil es syntaktisch auch kein Fehler ist, lediglich semantisch ist ``file_object_html.close`` nicht korrekt. Es wird der Namen "close" des Objekts "file_object_html" aufgelöst und das war es dann. Unter Umständen möchte man auch nur genau das machen, wenn man zum Beispiel Funktionen durch die Gegend reicht. Python hat daher keine Chance den Fehler zu sehen.
Sinnentlehrt hat geschrieben:Wäre das die Anwendung von with:

Code: Alles auswählen

with open(file_name_html, "w") as f:
    file_object_html.write(titel)
Und das wars dann?? Ohne irgendwas danach?
Ja, ganz genau so. Alles was du mit der Datei anstellst kommt in den with-Block. Dieser sorgt dann dafür, dass die Datei in jedem Fall geschlossen wird, auch falls zwischendurch Fehler auftreten sollten. Soweit es eben möglich ist. Wenn jemand den Strom ungünstig abschaltet, dann wird natürlich nichts mehr geschlossen ;-)
Das Leben ist wie ein Tennisball.
Sinnentlehrt
User
Beiträge: 67
Registriert: Mittwoch 30. Januar 2013, 22:32

Danke EyDu für die Erklärung, wenn auch mein Beispiel völliger Quatsch war. :oops:

Code: Alles auswählen

with open(file_name_html, "w") as f:
    f.write(title)
Nur der Form halber. :roll:
Du weißt das du vergessen hast einzukaufen, wenn du dich morgens mit Geschirrspülmittel duscht.
Antworten