@bob1704: *Das* Problem mit dem Quelltext ist, das er gar nicht erst kompiliert, weil das ``else`` in der ``for``-Schleife anders eingerückt ist als das ``if``. Einrückung ist per Konvention vier Leerzeichen pro Ebene. Das ``else`` könnte man sowieso komplett weglassen, weil der Zweig an der Stelle nichts bewirkt, was nicht sowieso passieren würde.
Dann werden einige Importe gar nicht verwendet. Der `TwilioRestClient` wird erstellt, aber dann auch nicht verwendet. Das hätte man aus dem Beispiel also heraus lassen können.
Ob der Kodierungskommentar so tief in der Datei noch greift weiss ich nicht. Der sollte üblicherweise in der ersten oder zweiten Zeile stehen. Der Compiler muss dass wissen bevor der Quelltext in dem Modul übersetzt werden kann.
Anstelle des `commands`-Moduls sollte man mittlerweile das `subprocess`-Modul verwenden. Wobei das zum Ermitteln des aktuellen Arbeitsverzeichnisses überhaupt gar nicht nötig ist. Zum einen gibt es die Funktion `os.getcwd()` die das ohne externe Programmaufrufe und plattformunabhängig macht. Zum anderen kann man `os.listdir()` aber auch einfach den Pfad relativ angeben.
Der Name `mist` ist irgendwie nicht wirklich toll. Wenn man irgendwo einen Namen hinschreiben und an einen Wert binden muss, den man dann aber gar nicht verwendet, hat sich der einfache Unterstrich als Konvention eingebürgert.
Den Namen `i` sollte man nicht, und insbesondere in einer Schleife nicht, an Werte binden die einen anderen Typ als ganze Zahlen haben. Damit rechnet fast jeder Programmierer der `i`, `k`, oder `j` in einer Schleife sieht. Zumal das für Dateinamen auch ein sehr schlechter Name ist. `filename` wäre ein viel besserer.
Statt mit der „magischen” Zahl -4 zu operieren, sollte man besser die `endswith()`-Methode auf Zeichenketten und/oder `os.path.splitext()` zum trennen von Dateiname und Erweiterung verwenden. Man kann sich das Filtern auch mit dem `glob`-Modul einfacher machen.
Dateien die man öffnet, sollte man auch wieder schliessen. Sonst kann es irgendwann passieren, dass das Betriebssystem für den Prozess keine neuen Dateien mehr öffnen kann. Man darf sich hier nicht auf eine zeitnahe Speicherbereinigung durch die Laufzeitumgebung von Python verlassen, weil das explizit nicht garantiert wird. Die ``with``-Anweisung bietet sich an der Stelle an.
Der Name für den Datei*inhalt* ist irreführend. Der Inhalt ist ja nicht das Dateiobjekt.
Wenn man in einem ``elif`` genau das Gegenteil von der Bedingung im ``if`` testet, dann will man eigentlich einfach nur ein ``else`` verwenden.
Dein Quelltext könnte dann letztendlich ungefähr so aussehen:
Code: Alles auswählen
#!/bin/env python
# -*- coding: utf-8 -*-
import os
from glob import glob
def main():
while True:
filenames = glob('*.f06')
if filenames:
filename = filenames[0]
cae_job_name, _extension = os.path.splitext(filename)
print filename
print cae_job_name
with open(filename) as f06_file:
file_content = f06_file.read()
if 'Fatal' not in file_content:
print 'no fatal'
sms_message = 'Your CAE Job {0} finished successfully'
else:
print 'Job not successful'
sms_message = 'Your CAE Job {0} was NOT successful'
sms_message = sms_message.format(cae_job_name)
if __name__ == '__main__':
main()
Was soll eigentlich passieren wenn es mehrere Dateien mit der Endung gibt? Deine sowie die Lösung mit `glob()` verwenden dann *irgendeine* der Dateien. Es ist nicht garantiert welche das sein wird.
Und was passiert wenn das Programm eine Datei ausliest, die gerade von einem anderen Programm geschrieben und damit noch nicht vollständig ist. Dann wird vielleicht kein 'Fatal' gefunden, obwohl das noch in der Datei landen wird.