Seite 1 von 1

Lesen von PFD-Dateien

Verfasst: Samstag 4. Februar 2023, 14:23
von Bebbi
Hallo zusammen

Ich bin gerade am Versuch, dass mir ein Python code PDF Dateien öffnet und diesen je nach Inhalt einen neuen Dateinamen gibt. Dabei habe ich folgenden code geschrieben:

Code: Alles auswählen

import os
import PyPDF2

path = r'C:\Users\Startklar\Desktop\CFDS\TEST'

for filename in os.listdir(path):
    if filename.endswith('.pdf'):
        pdf_file = open(os.path.join(path, filename), 'rb')
        pdf_reader = PyPDF2.PdfFileReader(pdf_file)

        found = False
        for page_num in range(pdf_reader.numPages):
            page = pdf_reader.getPage(page_num)
            text = page.extractText()
            if 'credit' in text:
                found = True
                break

        pdf_file.close()

        new_name = 'Sven' if found else 'Roger'
        os.rename(os.path.join(path, filename), os.path.join(path, new_name + '.pdf'))

[\code]

Bitte beachtet, dass ist erst der theoretische code, ich konnte ihn noch nicht ausprobieren, da ich zuerst an einem für Euch wohl undenkbaren Problem leide. Nach der erstmaligen Ausführung des codes teilt mir Python, folgendes mit:

"PyPDF2.errors.DeprecationError: reader.numPages is deprecated and was removed in PyPDF2 3.0.0. Use len(reader.pages) instead."

Mit dem Hinweis, dass ich jetzt len(reader.pages) verwenden soll bin ich irgendwie total überfordert. Ist das eine zusätzliche Bibliothek welche es einzufügen gibt oder handelt es sich um etwas anderes? 

Danke

Re: Lesen von PFD-Dateien

Verfasst: Samstag 4. Februar 2023, 14:41
von __deets__
Das ist eine Warnung, kein Fehler. Und alles, was das sagt, ist, dass pdf_reader.numPages bald nicht mehr geht. Sondern zu len(pdf_reader.pages) werden muss.

Re: Lesen von PFD-Dateien

Verfasst: Samstag 4. Februar 2023, 14:51
von __blackjack__
Wobei auch ``len(reader.pages)`` gar nicht gebraucht wird, denn man kann über das `pages`-Attribut direkt iterieren und bekommt die Seiten-Objekte. Es gibt keinen Grund hier einen Umweg über einen Index und `getPage()` zu nehmen. `getPage()` ist selbst auch „deprecated“ wie die Dokumentation verrät. Und müsste eigentlich auch eine Warnung ausgeben.

In neuem Code sollte man auch `pathlib` statt `os.path` & Co verwenden.

Statt selbst `close()` aufzurufen, würde man das mit der ``with``-Anweisung lösen. Oder man spart sich das komplett und gibt dem PDF-Reader beim erstellen einen Dateipfad statt eines Dateiobjekts, dann ist der Reader für das öffnen und schliessen der Datei verantwortlich.

Re: Lesen von PFD-Dateien

Verfasst: Mittwoch 8. März 2023, 21:11
von Bebbi
Ich bin es noch einmal :-)

Ich habe den Code in der Zwischenzeit auf len(pdf_reader.pages) umgeschrieben. Der Code hat auch ganz gut funktioniert. Leider muss ich diesen aber noch ein wenig anpassen, da ich den Dateinamen nicht ganz umschreiben möchte sondern nur mit dem im PDF gefundenen Wort ergänzen will.

Entsprechend soll also eine Datei mit dem Namen "Bestellung" in "Bestellung_Sven" geändert werden, wenn das Wort "Credit" im PDF vorhanden ist. Ist das Wort nicht vorhanden soll der Dateiname nicht verändert werden. Ich habe dies mit folgendem Text versucht.

Code: Alles auswählen

import os
import PyPDF2

path = r'C:\Users\Startklar\Desktop\CFDS\TEST'

for filename in os.listdir(path):
    if filename.endswith('.pdf'):
        pdf_file = open(os.path.join(path, filename), 'rb')
        pdf_reader = PyPDF2.PdfReader(pdf_file)

        found = False
        for page_num in range(len(pdf_reader.pages)):
            page = pdf_reader.pages[page_num]
            text = page.extract_text()
            if 'credit' in text:
                found = True
                break

        pdf_file.close()

        new_name = filename & 'Sven' if found else new_name = old_name
        os.rename(os.path.join(path, filename), os.path.join(path, new_name + '.pdf'))
Dabei kommt folgende Fehlermeldung

"Cannot assign to conditional expression" Python hat Mühe mit der Bezeichnug "filename" in Zeile 21. Wie kann ich das ändern?

Re: Lesen von PFD-Dateien

Verfasst: Mittwoch 8. März 2023, 21:24
von sparrow
Wie kommst du denn darauf, dass man mit & Strings verkettet?
Eine Zeile weiter machst du es anders.

Ich würde allerdings auch das nicht verwenden sondern an beiden Stellen f-Strings.

Re: Lesen von PFD-Dateien

Verfasst: Mittwoch 8. März 2023, 21:26
von __deets__
Was glaubst du denn tut das &? Und wenn du links des ternären if schon new_name stehen hast, dem was zugewiesen wird, dann kann das im else auch weg. In das löst auch dein Problem.

Re: Lesen von PFD-Dateien

Verfasst: Mittwoch 8. März 2023, 21:28
von Sirius3
Indem Du nicht irgendeine Syntax erfindest, sondern das benutzt, was Python unterstützt.
Statt os benutzt man pathlib und über einen Index iteriert man nicht.

Code: Alles auswählen

from pathlib import Path
import PyPDF2

basepath = Path.home() / "Desktop" / "CFDS" / "TEST"

for path in basepath.glob("*.pdf"):
    with path.open('rb') as pdf_file:
        pdf_reader = PyPDF2.PdfReader(pdf_file)
        found = any(
            'credit' in page.extract_text()
            for page in pdf_reader.pages
        )

    if found:
        new_name = path.with_stem(path.stem + '_Sven')
        path.rename(new_name)