Lesen von PFD-Dateien

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
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Antworten