Datei entfernen sobald möglich.

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
benpython
User
Beiträge: 8
Registriert: Sonntag 10. Mai 2020, 12:24

Hallo zusammen,

in meinem Skript will ich eine bestimmte Datei entfernen. Wenn das fehlschlägt weil z.B. de Datei gerade noch verwendet wird.
Soll das Skript 5 Sekunden warten und es dann nochmal probieren. Und das als loop solange bis es funktioniert.

Code Beispiel ist in Python 2.7 das ist notwending aufgrund der verwendeten Bibliotheken.

Code: Alles auswählen

	    try:              
                print getActualTime()+" REMOVING "+f+" FROM INPUT FOLDER!"
                os.remove(os.path.join(pdf_dir,f))
            except Exception as e:
                print e
                
Wie kann ich das machen? Innerhalb von except ist die Exception immer wahr also kann ich keine while loop einbauen..

Kann jemand helfen?
Danke im Voraus!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Wechsel auf Python 3.x. Wirklich. Wenn die Bibliotheken das nicht können, dann brauchst du andere Bibliotheken. Die musst du halt suchen.

Warum das mit der while-Schleife nicht funktionieren soll, verstehe ich nicht.

Pseudocode:

Code: Alles auswählen

solange die_datei existiert:
    versuche:
        lösche die_datei
    fehlschlag:
        warte 5 Sekunden
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Code: Alles auswählen

import pathlib
import time

PATH = pathlib.Path(r'C:\Users\xxx\Desktop\Microsoft Office Excel-Arbeitsblatt (neu).xlsx')


while True:
    try:
        PATH.unlink()
        print(f"Die Datei {PATH.name} wurde gelöscht!")
        break
    except PermissionError:
        print(f"Datei {PATH.name} konnte nicht gelöscht werden.")
        time.sleep(5)
benpython
User
Beiträge: 8
Registriert: Sonntag 10. Mai 2020, 12:24

Jankie hat geschrieben: Donnerstag 20. August 2020, 07:55

Code: Alles auswählen

import pathlib
import time

PATH = pathlib.Path(r'C:\Users\xxx\Desktop\Microsoft Office Excel-Arbeitsblatt (neu).xlsx')


while True:
    try:
        PATH.unlink()
        print(f"Die Datei {PATH.name} wurde gelöscht!")
        break
    except PermissionError:
        print(f"Datei {PATH.name} konnte nicht gelöscht werden.")
        time.sleep(5)
Dankeschön!
Yes! So funktionierts:

Code: Alles auswählen

while f in os.listdir(pdf_dir):
                try:              
                    print getActualTime()+" REMOVING "+f+" FROM INPUT FOLDER!"
                    os.remove(os.path.join(pdf_dir,f))
                except Exception as e:
                 	print e
                   	time.sleep(5)
sparrow hat geschrieben: Donnerstag 20. August 2020, 07:54 Wechsel auf Python 3.x. Wirklich. Wenn die Bibliotheken das nicht können, dann brauchst du andere Bibliotheken. Die musst du halt suchen.

Warum das mit der while-Schleife nicht funktionieren soll, verstehe ich nicht.

Pseudocode:

Code: Alles auswählen

solange die_datei existiert:
    versuche:
        lösche die_datei
    fehlschlag:
        warte 5 Sekunden
Ich benutze für diesen Fall 2.7 wegen der win32print win32api Bibliotheken.
Es geht mir ums drucken. Das skript druckt pdf-Dateien sobald sie in einen Hotfolder fallen auf dem gewünschten Drucker der lokal installiert ist.
Wenn du eine Bibliothek (Modul) kennst welches das kann, bin ich sofort dabei mit python3.8 ;)
Vielen Dank euch allen!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

win32print ist doch Teil von pywin32. Und das ist ganz normal für Python 3.8 verfügbar.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn du dann umgesteigen bist solltest du auch nicht mehr os.remove() und os.listdir() verwenden. Stattdessen besser das pathlib Modul mit path.unlink() und path.glob()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Ob eine Datei existiert, prüft man nicht mit ›in os.listdir‹ sondern per ›isfile‹. gewöhn Dir gleich sprechende Variablennamen an, f sollte wohl filename heißen, und die tatsächliche Zeit bekommst Du bei einem Computer nicht, da gibt es höchstens die aktuelle Zeit, die man nach Namenskonvention (Funktionsnamen schreibt man wie Variablennamen komplett klein) get_current_time schreiben würde.
benpython
User
Beiträge: 8
Registriert: Sonntag 10. Mai 2020, 12:24

sparrow hat geschrieben: Donnerstag 20. August 2020, 08:24 win32print ist doch Teil von pywin32. Und das ist ganz normal für Python 3.8 verfügbar.
Unter 3.8 und höher habe ich es noch nie installiert bekommen. Versucht hab ich es immer mit pip auf macOS catalina und windows 10 und bekomme dann eine Meldung wie:
ERROR: Could not find a version that satisfies the requirement pywin32
ERROR: No matching distribution found for pywin32
Vielen Dank für die Hilfe und Ratschläge! Das pathlib module werde ich mir aufjedenfall anschauen und nochmal versuchen das ganze unter py3.8 zum laufen zu bringen.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Unter maxOS sollte das auch nicht tun. Das heißt ja pyWIN32, weil es WINdows-Dinge tut. Aber unter Windows kann man das problemlos mit pip installieren und es funktioniert. Kann man auch gut auf deren PyPIi sehen.
Antworten