@Kellerfish: Weitere Anmerkungen: Unter Unix ist es üblich '\n' als Zeilenende zu verwenden und nicht als Zeilentrenner, also das Zeichen tatsächlich ans Ende *jeder* Zeile zu schreiben, auch und gerade ans Ende der letzten Zeile einer Textdatei. Denn sonst funktionieren bestimmte Sachen die man recht häufig mit Textdateien macht nicht reibungslos, wie das verbinden von Textdateien in dem man sie einfach nacheinander verarbeitet. Wenn die letzte Zeile einer Datei dann nicht durch ein '\n' abgeschlossen ist, dann ist sie nicht von der ersten Zeile der nächsten Datei abgetrennt.
Konstanten werden per Konvention komplett gross geschrieben.
Auf Modulebene sollte man nur Code stehen haben der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst und es wird durch folgendes Idiom aufgerufen:
Dadurch kann man das Modul als Programm aufrufen, aber auch importieren und zwar ohne das die `main()`-Funktion automatisch ausgeführt wird. Dann kann man zum Beispiel Sachen aus dem Modul interaktiv oder automatisiert testen, oder in anderen Modulen wiederverwenden. Und einige Werkzeuge, zum Beispiel zum erstellen von Dokumentation, erwarten auch das man Module importieren kann ohne das dabei irgend etwas ”passiert”.
`fobj` ist kein besonders guter Name. Es ist eine Verquickung von einer Abkürzung mit einem nichtssagenden `obj` dahinter. Da in Python *jeder* Wert ein Objekt ist, könnte man `obj` an *jeden* Namen anhängen, was aber Null Informationsgehalt für den Leser hat. Das Objekt ist eine Datei und die hat eine Bedeutung, und diese Bedeutung sollte man in dem Namen wiederfinden. Ähnliches gilt für den Namen `wert`.
Die Klammern um den Funktionsaufruf bei der Definition von `wert` sind überflüssig. Genau wie die Operation die beiden literalen Zeichenketten zu einer zu verbinden. Das hätte man gleich als *eine* Zeichenkette schreiben können. Und wie weiter oben schon erwähnt gehört das Zeilenende-Zeichen ans Ende und nicht an den Anfang.
`status` wird in dem Quelltext definiert aber dann überhaupt nicht verwendet‽
Bei Zeitangaben würde ich das `datetime`-Modul den eher low-level, C-ähnlichen Funktionen aus dem `time`-Modul vorziehen.
Der Zeitstempel ist *ein* Wert und wenn das Komma als Spaltentrenner in der Datei verwendet wird, dann trennt man damit den einen Wert unnötig in zwei Teilwerte auf. Eventuell möchte man hier auch eine standardisiertere Form der Zeitangabe zum Beispiel nach ISO 8601 verwenden und eventuell auch die Differenz zu UTC mit speichern. Das kann auch innerhalb ein und der selben Zeitzone sinnvoll sein um mit der Umstellung Sommerzeit/Winterzeit korrekt umgehen zu können wenn man anhand der An- und Abmeldezeiten irgendwann einmal Zeitspannen ausrechnen möchte.
Die `close()`-Methode muss man auch *aufrufen* und nicht nur referenzieren. Besser wäre es die Datei zusammen mit der ``with``-Anweisung zu öffnen, dann passiert das schliessen auf jeden Fall wenn der Programmfluss den ``with``-Block verlässt — egal aus welchem Grund.
`mu` und `x` wären dann wieder schlecht gewählte Namen in diesem Zusammenhang.
Statt mit `readlines()` alle Zeilen komplett in eine Liste in den Arbeitsspeicher einzulesen obwohl man nur an der letzten Zeile interessiert ist, könnte man auch in einer ``for``-Schleife über das Dateiobjekt iterieren (bzw. das entsprechende Objekt das mit dem `csv`-Modul erstellt wurde). Nach der Schleife hat man dann in der Laufvariablen die letzte Zeile (bzw. den letzten Datensatz). Natürlich nur unter der Voraussetzung das die Datei nicht leer ist — den Fall muss man auch berücksichtigen.
So klein das Programm bisher auch aussehen mag: Man ist IMHO schon an einem Punkt wo man anfangen sollte die Umsetzung auf Funktionen aufzuteilen die jeweils ein in sich abgeschlossenes Teilproblem lösen. Das macht das Programm übersichtlicher und man kann einzelne Teillösungen besser und isoliert vom Rest testen.