@sprunus-ng: Anmerkungen zum Quelltext:
Namen sollte man nicht kryptisch abkürzen. Einbuchstabige Namen sind selten gute Namen. Ausnahmen sind `i`, `j`, und `k` für ganze Zahlen als Laufvariablen in Schleifen und wenn die für Indexzugriffe verwendet werden, und `x`, `y`, und `z` für Koordinaten. Aber wenn man `file` meint, sollte man nicht nur `f` schreiben, und statt `c` besser `command`.
Wobei man den Wert von `c` auch nicht extra an einen Namen binden muss. Genau wie `data`, denn das sollte keine Liste mit *einem* Element sein, sondern einfach eine Zeichenkette. Und die kann man dann auch direkt als Argument in den Methodenaufruf schreiben. Dann fällt auch auf, dass es einfacher ist das abschliessende Zeilenende-Zeichen mit in die Zeichenkette zu schreiben statt es nachträglich mit ``+`` anzuhängen.
Bei den Zeilen steht überall das "\n" am Ende, ausser bei einer, da steht es am Anfang der nächsten Zeile. Das übersieht man leicht.
Semantisch ist die Zeile einer CSV-Datei jetzt nicht wirklich eine Überschrift, sollte also auch nicht als solche gesetzt werden.
In HTML-Quelltext haben bestimmte Zeichen eine Bedeutung für die Auszeichnung, darum ist es besser wenn man sicherstellt, das die entsprechend maskiert werden in Daten die man da einfügt. Es gibt im `html`-Modul eine Funktion dafür.
Beim öffnen von Textdateien sollte man immer explizit die Kodierung der Datei angeben. Bei der CSV-Datei müsstest Du das selber wissen. Bei der HTML-Datei müsste man wissen ob der Webserver in den Headerdaten eine Kodierung vorgibt. Tut er das nicht, dann muss die Kodierung entsprechend in den Kopfdaten des HTML-Dokuments angegeben werden, oder es wird vom Browser CP1252 erwartet wenn da nichts steht.
Beim einlesen der CSV-Datei wurde ``with`` verwendet, beim schreiben der HTML-Datei aber nicht. Warum nicht?
Das Programm wird mit einer Ausnahme enden wenn die CSV-Datei leer ist. In dem Fall wird `line` nicht definiert, und die Zuweisung nach der Schleife funktioniert nicht.
`os.system()` sollte man nicht verwenden. Da steht in der Dokumentation auch ein Verweis auf das `subprocess`-Modul.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import html
import subprocess
def main():
with open(
"/home/tim/Adafruit_Python_DHT/examples/log.csv", "r", encoding="ASCII"
) as lines:
line = None
for line in lines:
pass
html_fragment = (
"<em>(Keine Messwerte in Logdatei vorhanden)</em>"
if line is None
else html.escape(line)
)
with open("/var/www/data/index.html", "w", encoding="CP1252") as file:
file.write(
"<html>\n"
"\t<head>\n"
"\t\t<title>Pi Data</title>\n"
"\t</head>\n"
"\t<body>\n"
f"\t\t<p>{html_fragment}</p>\n"
"\t</body>\n"
"</html>\n"
)
subprocess.run(["sudo", "/etc/init.d/apache2", "reload"], check=True)
if __name__ == "__main__":
main()
Jetzt könnte man dem Benutzer unter dem das läuft in ``/etc/sudoers`` das Recht geben nur genau diesen Neustart ausführen zu dürfen. Schon braucht's keine Root-Rechte mehr. Allerdings ist die Frage warum da überhaupt der Webserver neu gestartet wird. Das sollte normalerweise gar nicht nötig sein.
Was zumindest theoretisch noch ein Problem ist, ist die Behandlung der CSV-Datei als wenn eine Textzeile einem Datensatz entspricht. Das muss grundsätzlich nicht so sein, weil CSV ein bisschen komplexer ist und auch Zeilenenden innerhalb von Zellen erlaubt.