Seite 1 von 1

Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 07:52
von Neu111
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.

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:00
von Sirius3
@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.

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:01
von sparrow
@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.

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:05
von Jankie
Ich würde aber statt dem os Modul das pathlib Modul benutzen.

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:13
von Neu111
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

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:20
von __deets__
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.

Re: Datei durch andere Datei ersetzen

Verfasst: Freitag 17. Juli 2020, 08:23
von sparrow
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.