Seite 1 von 1

File close

Verfasst: Donnerstag 11. Mai 2023, 21:23
von DMD-OL
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?

Re: File close

Verfasst: Donnerstag 11. Mai 2023, 21:46
von sparrow
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?

Re: File close

Verfasst: Donnerstag 11. Mai 2023, 21:48
von Sirius3
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.

Re: File close

Verfasst: Freitag 12. Mai 2023, 18:50
von DMD-OL
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...

Re: File close

Verfasst: Freitag 12. Mai 2023, 19:07
von DMD-OL
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'