@Marvin93: Alles was eine Funktion ausser Konstanten benötigt sollte als Argument(e) übergeben werden. Und wenn es eine Konstante ist, dann wird der Name KOMPLETT_GROSS geschrieben. Sie den
Style Guide for Python Code.
Und so wie Du `filename` definierst scheint das keine Konstante zu sein. Und damit sollte es ein Argument sein. Den Dateinamen kann man auch an mehr als eine Funktion als Argument übergeben, wenn man den woanders auch noch mal braucht. Das ist also kein Argument dafür den zu einer globalen Variable zu machen. Zudem sollte der Dateiname der übergeben wird, ausch schon der tatsächliche Dateiname sein. Es ist nicht die Aufgabe einer Speichern-Funktion eine Dateierweiterung auszutauschen. Das fällt in den Aufgabenbereich des Aufrufers.
Warum funktioniert bei Dir `pathlib` nicht? Das wäre komisch wenn das bei allen aus Dir funktioniert. Und selbst wenn `pathlib` aus irgendwelchen komischen Gründen nicht funktioniert, ist das ein Pfad und dafür gibt es Funktionen in `os.path`. Zum Beispiel `os.path.splitext()` um die Dateierweiterung abzutrennen.
Warum willst Du das Wörterbuch mit den Arrays/Matrizen denn in eine Datei schreiben? Wenn das irgend wann einmal wieder von einem Programm verarbeiten werden soll, dann machst Du das falsch. Dafür verwendet man standardisierte Formate für die es Bibliotheken zum schreiben und lesen gibt, und erfindet nicht selbst ein Format. HDF5 könnte sich hier eventuell anbieten.
Wie kann man denn bei der Definition der Funktion schon ein `dict_results` als Default-Wert haben? Das sieht extrem falsch aus.
`text` ist kein so prickelnder Name für ein Dateiobjekt.
Beim öffnen von Textdateien sollte man immer explizit eine Kodierung angeben. Sonst kann man unangenehme Überraschungen erleben wenn man das mal auf einem anderen Rechner ausführt, oder mit anderen Systemeinstellungen die die Sprache/Kodierung betreffen.
Die äusssere ``for``-Schleife kann man gleich über die `items()` laufen lassen, denn in der Schleife werden ja in jedem Fall Schlüssel *und* Wert benötigt.
Die innere ``for``-Schleife ist in Python ein „anti pattern“. Statt mit ``for i in range(len(sequence)):` über den Umweg über einen Index auf die Elemente zuzugreifen, kann man auch *direkt* über die Elemente der Sequenz iterieren. Der Name `element` den Du für den *Index* des Elements verwendest ist an der Stelle auch sehr verwirrend, denn da würde man als Leser das Element selbst als Wert erwarten. Und dann kann man `str()` per `map()` auf die Elemente anwenden und die `writelines()`-Methode verwenden, und schon braucht man gar keine ``for``-Schleife mehr für den ``else``-Zweig selber schreiben.
Bei Dateien sollte man wenn es geht die ``with``-Anweisung verwenden, um ein Schliessen in jedem Fall zu garantieren.
In beiden Zweigen des ``if``/``else`` wird als erstes die gleiche Anweisung ausgeführt – die gehört also gar nicht dort rein, sondern *einmal* *vor* dieses Konstrukt.
Ungetestet:
Code: Alles auswählen
def save_dict_as_text(filename, data):
with open(filename, 'w', encoding='ASCII') as file:
for key, value in data.items():
file.write(key)
if key == 'time':
file.write(str(value))
else:
file.writelines(map(str, value))