File close

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
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Hallo Leute,
in meinem Code habe ich ein Permission denied Error, obwohl ich

Code: Alles auswählen

with open()

benutze. Ich habe bisher versucht, die Datei zu schließen um sie dann erneut wieder öffnen zu können.
Im Netz habe ich gelesen, dass das automatisch geschehen soll, eben mit with open(...).
Hier ein Auszug aus meinem Code:

Code: Alles auswählen

    def popup_window(self, name, message, duplicat_lst):
        if duplicat_lst is None:
            ctypes.windll.user32.MessageBoxW(0, message, "WARNUNG", 48)
        else:
            pdf_path = os.path.join(self.desktop_path, name)
            pdfWriter = PyPDF2.PdfFileWriter()
            dublikat_message = f'{message}\n\n\n'
            for duplikat in duplicat_lst:
                dublikat_message += f'{duplikat}\n\n'
            warning_ok_pressed = ctypes.windll.user32.MessageBoxW(0, dublikat_message, "WARNUNG", 48)
            if warning_ok_pressed:
                for duplicat in duplicat_lst:
                    pdf1File = open(duplicat, 'rb')
                    pdf1Reader = PyPDF2.PdfFileReader(pdf1File)
                    for pageNum in range(pdf1Reader.numPages):
                        pageObj = pdf1Reader.getPage(pageNum)
                        pdfWriter.addPage(pageObj)


                    with open(pdf_path, 'wb') as pdfOutputFile:
                        pdfWriter.write(pdfOutputFile)


                    pdfOutputFile.close()
                    pdf1File.close()
Fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:\Users\dmd__\Documents\Programmierung\PyCharm\Barcode Finder\Barcode_Verwaltung.py", line 101, in get_key
    self.search_barcode.search_barcode(self.barcode)
  File "C:\Users\dmd__\Documents\Programmierung\PyCharm\Barcode Finder\Search_Barcode.py", line 49, in search_barcode
    self.popup_window(document_name, "Es gibt leider (ein) Duplikat(e)!", lst_barcode)
  File "C:\Users\dmd__\Documents\Programmierung\PyCharm\Barcode Finder\Search_Barcode.py", line 87, in popup_window
    with open(pdf_path, 'wb') as pdfOutputFile:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\dmd__\\Desktop\\4306188362562.pdf'
Kann mir jemand von euch helfen, wie man eine bereits geöffnete Datei automatisch schließt, um sie dann wieder öffnen zu können?
Benutzeravatar
sparrow
User
Beiträge: 4512
Registriert: Freitag 17. April 2009, 10:28

Gibt es ein grundsätzliches Rechteproblem?
Existiert die Datei bereits?
Hat ein anderes Programm die Datei geöffnet?
Verwendest du den Pfad an einer anderen Stelle im Programm?

Ist es richtig, dass du für jedes Dublikat die Ausgabedatei wieder überschreibst?
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Wahrscheinlich hast du die PDF-Datei die du schreiben möchtest, irgendwo anders zum Anzeigen geöffnet. Das mag Windows nicht. Du musst also die Datei überall schließen, bevor du sie überschreiben kannst.
Variablennamen schreibt man komplett klein, sie enthalten keine Abkürzungen und keine Nummern. Für das Lesen der PDF-Datei benutzt du nicht with. Warum nicht? Das explizite Aufrufen von close ist bei with nicht nötig.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Oh, das ist mir entgangen. Ich werde dann natürlich auch beim Lesen with benutzen :) :)
@sparrow: Ich suche mit einem eingescannten Barcode eine zugehörige PDF, die dann angezeigt wird bzw. wenn es fehlerhaft mehrere PDFs sind, die ich mit nur einem Barcode finde(Fehler, den ich
auch berücksichtigen will) sollen die gesammelt in einer PDF ausgegeben werden.
In beiden Fällen will ich aber auch einen automatischen "Schließmechanismus" finden, um eine PDF wieder öffenen zu können.
Ich habe den oberen Lesenbefehl die ganze Zeit übersehen :( Vielleicht ist es ja schon die Lösung, wenn ich dort auch einen with-Befehl verwende...
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Ich habe es grade getestet.
Nochmal zum Verständnis: Ich erstelle eine PDF durch das Scannen eines Barcodes. Die PDF wird auf dem Desktop gespeichert und wird dann einfach geöffnet.
Wenn ich denselben Barcode scanne ohne das vorher geöffnete PDF wieder zu schließen, bekomme ich den Fehler:

Code: Alles auswählen

    with open(pdf_path, 'wb') as pdf_output_file:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\dmd__\\Desktop\\4306188362562.pdf'
Antworten