Datei durch andere Datei ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

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.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
sparrow
User
Beiträge: 4245
Registriert: Freitag 17. April 2009, 10:28

@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.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich würde aber statt dem os Modul das pathlib Modul benutzen.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

sparrow hat geschrieben: Freitag 17. Juli 2020, 08:01 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.
Jankie hat geschrieben: Freitag 17. Juli 2020, 08:05 Ich würde aber statt dem os Modul das pathlib Modul benutzen.
Kannst du erläutern warum?

Danke
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
sparrow
User
Beiträge: 4245
Registriert: Freitag 17. April 2009, 10:28

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.
Antworten