Absoluter Pfad

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
forumseeker
User
Beiträge: 2
Registriert: Freitag 5. Januar 2024, 15:04

Hallo!

Zunächst mal ein frohes Neues Jahr!

Ich bin neu hier, habe von Python gar keine Ahnung, will es aber lernen.

Ich habe folgenden Code geschrieben um Bilder in einen HTML-Datei zu schreiben, er bringt mir aber nicht das gewünschte Ergebnis, sondern nur "Hyroglyphen" Warum ?

Code: Alles auswählen

path = r"D:\xxxxx"
from os import walk

_, _, filenames = next(walk(path))

print(filenames)
print(path)

html = """
<html>
  <head>
    <title></title>

    <style>
        img {
          width: 400px;
          height: 150px;
          object-fit: cover;
        }
    </style>
  </head>
  <body>
  <h1>Meine Bildergalerie</h1>
"""

for f in filenames:
    html += '<img src=' + path + f + '">'

html += """
  </body>
</html>
"""

print(html)

# Write HTML String to file.html
# with open("index.html", "w") as file:
#    file.write(html)
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

Du musst beim Schreiben in die Datei sowie im HTML selbst das Encoding angeben; für modernes HTML 5 heißt das UTF-8. Gibst du das Encoding beim Schreiben nicht an, wird das Standard-Encoding deines OS verwendet und da du offensichtlich Windows verwendest, wird das Windows-1252 oder so sein. Wenn der Browser dann im HTML keine Infos zum Encoding findet, nimmt er etwas an und das geht ja scheinbar daneben. Zudem baut man HTML nicht per Strings zusammen, sondern nimmt eine geeignete Bibliothek. D.h. entweder eine Template Engine (Jinja2, mako, …) oder so etwas wie dominate.
forumseeker
User
Beiträge: 2
Registriert: Freitag 5. Januar 2024, 15:04

selbst gefunden. Waren die escape-Zeichen. An einige habe ich gedacht, aber nicht an alle....
Benutzeravatar
grubenfox
User
Beiträge: 432
Registriert: Freitag 2. Dezember 2022, 15:49

Darum...
nezzcarth hat geschrieben: Freitag 5. Januar 2024, 15:25 Zudem baut man HTML nicht per Strings zusammen, sondern nimmt eine geeignete Bibliothek. D.h. entweder eine Template Engine (Jinja2, mako, …) oder so etwas wie dominate.
... erspart einem das "an alles denken müssen", hindert einen aber nicht daran andere Fehler zu machen. ;)

(etwas Offtopic: Aber von mir ein Danke für die Frage (und Danke! an nezzcarth für die Antwort). Ich glaube 'dominate' war die Bibliothek von der ich hier vor einigen Monaten hier zum ersten Mal hörte und an deren Namen ich mich vor einigen Wochen vergeblich versuchte zu erinnern. Wenn ich jetzt nur noch wüsste warum ich das Teil vor einigen Wochen suchte... :( )
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@forumseeker: Anmerkungen zum Quelltext: Importe stehen normalerweise am Modulanfang (nach She-Bang-Zeile und ggf. einem Modul-DocString).

``_, _, filenames = next(walk(path))`` ist, äh kreativ für ``filenames = os.listdir(path)``. Wobei man auch das nicht mehr verwendet seit es das `pathlib`-Modul gibt. Da spart man sich dann auch das Zusammensetzen von Pfad und Dateinamen, was man übrigens auch nicht mit ``+`` gemacht hätte, sondern mit `os.path.join()`.

Man addiert nicht wiederholt Zeichenketten auf. Zeichenketten sind unveränderbar, das heisst da muss man damit rechnen, das bei jeder Addition die alten und die neuen Daten in eine neue Zeichenkette kopiert werden, was quadratisches Laufzeitverhalten hat. Der idiomatische Weg ist es die Teilzeichenketten mit der `join()`-Methode von Zeichenketten zusammen zu setzen.

`f` ist kein guter Name. Einbuchstabige Namen sind selten gute Namen. Es gibt Ausnahmen wie `x`, `y`, und `z` für Koordinaten oder `i`, `j`, und `k` für ganze Zahlen die als Index- und Laufvariablen verwendet werden. Aber wenn man `filename` meint, sollte man nicht nur `f` schreiben.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path


def main():
    base_path = Path(R"D:\xxxxx")

    images_html_fragment = "".join(
        f"<img src='{path.absolute().as_uri()}'>"
        for path in base_path.iterdir()
        if path.is_file()
    )
    html = f"""
    <html>
      <head>
        <title></title>
        <style>
            img {{
              width: 400px;
              height: 150px;
              object-fit: cover;
            }}
        </style>
      </head>
      <body>
      <h1>Meine Bildergalerie</h1>
        {images_html_fragment}
      </body>
    </html>
    """
    Path("index.html").write_text(html, encoding="ascii")


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten