Hallo,
ich aktualisiere eine Datei namens test.csv, indem ich den kompletten Inhalt einlese, einen Schleifendurchlauf durchführe, und den Inhalt anschließend in eine neue Datei namens temp.csv speichere.
Nach diesem Vorgang liegen nun zwei Dateien in meinem Ordner, die alte Datei test.csv und die neue Datei temp.csv.
Was ist jetzt die eleganteste Lösung, damit am Ende nur eine Datei names test.csv übrig bleibt (die Datei test.csv muss natürlich den neuen Inhalt aus temp.csv bekommen)
OK - ich könnte wie folgt vorgehen:
1) test.csv löschen (os.remove)
2) temp.csv in test.csv umbenennen (os.rename)
Das Problem: ich muss sicherstellen, dass die Umbenennung erst dann stattfindet, wenn die alte Datei test.csv tatsächlich schon gelöscht wurde.
Ja, ich könnte die Überprüfung "existiert die Datei noch?" mittels Schleife durchführen, jedoch scheint es nicht die eleganteste Lösung zu sein.
Hat jemand eine Idee?
PS: ich nutze das csv- und os-Modul, und möchte ungern auf weitere Module zurückgreifen.
Datei durch andere Datei ersetzen
@Neu111: wahrscheinlich ist das so ein doofes Windows, das Dateien erst umbenannt werden können, wie die Datei nicht existiert. Wenn Du die Datei löschst, dann existiert die Datei nicht mehr, davon solltest Du ausgehen können. Wenn nicht, dann ist es am besten, die Exception abzufangen und entsprechend darauf zu reagieren.
@Neu111: Ja, normalerweise macht man das genau so. In eine neue Datei schreiben, die alte löschen, die neue umbenennen.
Wenn der Aufruf von os.remove durch ist und der nächste Befehl abgearbeitet wird, ist die Datei gelöscht.
Wenn der Aufruf von os.remove durch ist und der nächste Befehl abgearbeitet wird, ist die Datei gelöscht.
Zeile 1: os.remove(....)
Zeile 2: os.rename(....)
Kann es nicht passieren, dass die Zeile 2 schon ausgeführt wird, noch bevor die Datei vollständig aus Windows gelöscht wurde?
In diesem Fall würde der rename-Befehl wahrscheinlich nicht klappen, da die alte Datei noch existiert.
Kannst du erläutern warum?
Danke
Nein, das kann nicht passieren. Was aber passieren kann ist, dass das löschen und das umbenennen fehlschlagen. Weil zb ein anti-Viren-Programm die neue Datei noch scannt. Und darum wirst du um deinen schleifen-Ansatz nicht rumkommen. Windows ist halt so.
os.remove löst einen entsprechenden Systemaufruf aus. Der sorgt dafür, dass dir Dateieintrag aus dem Dateisystem entfernt wird und erst wenn das erfolgreich war, kehrt er Programmfluss zurück und die nächste Zeile wird ausgeführt.
Wenn das nicht erfolgreich war, dann wird eine entsprechende Exception ausgelöst und es gilt, was __deets__ sagt. Darauf musst du also vorbereitet sein.
Wenn das nicht erfolgreich war, dann wird eine entsprechende Exception ausgelöst und es gilt, was __deets__ sagt. Darauf musst du also vorbereitet sein.