Kontoauszug (pdf) mit Python auslesen

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
wiesi505
User
Beiträge: 6
Registriert: Donnerstag 27. Januar 2022, 10:29

Moin zusammen ich versuche mich derzeit in Python um das v. g. Problem zu lösen. Ich habe keinerlei Programiererfahrung. Hab aber schon ein Programm geschrieben mit dem man Temperaturen umrechen kann. Also von Celsius in Fahrenheit und in Kelvin.

Eine App zur Auswertung möchte ich nicht verwenden (Datenschutz) und meine Bank bietet keine Möglichkeiten meine Kontobewegungen zu analysieren.

Ziel: Eine PDF Datei (Kontoauszug) in einem Ordner mit Python auszulesen und die einzelen Buchungen in eine Exeltabelle, in ein Tabellenblatt zu schreiben und zwar so, dass gleiche Buchungen (Amazon) immer untereinander in eine Zeile geschrieben werden. Zu guter letzt, soll dann noch die Summe gebildet werden.

Um in das Thema rein zu kommen hab ich mir von "The Morpheus Tutorials" das Python Tutorial angesehen.
Hab mich von dem https://www.youtube.com/watch?v=OZo2HxoIOtw inspirieren lassen.

Ich bin noch vollkommen am Anfang.
Mir ging es erstmal darum die Funktionen Schritt für Schritt kennen zu lernen. Nur leider scheitere ich schon beim ersten Schnipsel. Es wird nicht das ausgegeben was ich erwartet haben. Nämlich nichts.
Bisher sieht der Code so aus.

from PyPDF2 import PdfFileReader

def get_meta(path):
with open(path, 'rb') as f:
pdf = PdfFileReader(f)
nop = pdf.getNumPages()
print(nop)

if __name__ == '__main__':
path = "C:\test\test.pdf"

Ich hatte eigentlich erwartet das PyCharm mir unten die Seitenanzahl ausgibt. Dort steht jedoch nur "Process finished with exit code 0"
Hab auch andere pdf-Dokumente versucht, immer das gleich!

Jemand ne Idee?
Schoneinmal vielen Dank im vorraus, Alex
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht so nicht. PDFs sind letztlich Grafiken, und um die darin enthaltenen Textinformationen zu extrahieren braucht man ueblicherweise OCR - optical character recognition. Das ist ein komplexes Thema, das du zum jetzigen Zeitpunkt nicht durchdringen wirst. Wenn du ein bisschen stoebern willst, um dir davon ein Bild zu machen: tesseract ist der Name einer populaeren, freien OCR Bibliothek, und da gibt's auch Python-Projekte mit.

Zu deinem Problem: du musst die Funktion auch aufrufen. Nur path zuweisen reicht nicht.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nochmal als Nachtrag: wenn du deine Kontodaten anders exportieren kannst - zB als CSV, das geht bei meiner - dann hast du gleich ein Format, mit dem du was anfangen kannst.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen, die verwirrend sind, no-operation als Anzahl der Seiten zu bezeichnen ist für mich zumindest sehr verwirrend.
\ hat in Strings eine besondere Bedeutung. Deshalb nimmt man als Pfadtrenner /.
Die Funktion mußt Du auch aufrufen, sonst passiert nichts:

Code: Alles auswählen

from PyPDF2 import PdfFileReader

def get_meta(path):
    pdf = PdfFileReader(path)
    number_of_pages = pdf.getNumPages()
    print(number_of_pages)

if __name__ == '__main__':
    get_meta("C:/test/test.pdf")
Ob Du aus dem PDF die gewünschten Informationen einfach extrahieren kannst, hängt stark davon ab, wie das PDF geschrieben worden ist.
Wenn Du immer Dateien hast, die mit dem selben Erzeugungsprogramm generiert worden sind, hast Du vielleicht gute Chancen, das bietet aber keine Garantie, falls Deine Bank mal ihre Tools intern ändert.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__deets__ hat geschrieben: Donnerstag 27. Januar 2022, 11:06 Das geht so nicht. PDFs sind letztlich Grafiken, und um die darin enthaltenen Textinformationen zu extrahieren braucht man ueblicherweise OCR
Hi, bist du dir da wirklich zu 100% sicher?
PDFs können Grafiken enthalten aber ich bezweifle das die Bank aus den Kontoauszugsdaten zuerst eine Grafik bastelt und diese dann in eine PDF einbettet.

Ich kann meine PDF Kontoauszüge einwandfrei mit PyPDF2 zerlegen.

@Threadstarter
Hier noch ein weiteres Tutorial (auf Englisch) welches dir eventuell helfen kann dein Ziel zu erreichen.
https://towardsdatascience.com/how-to-e ... 5482a96de7
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ThomasL: du hast recht, es können auch Texte enthalten sein. Aber of sind das nur grafische Kurven. Und selbst wenn es Texte sind, sind sie anders als bei HTML oft nicht gut zu verarbeiten, es gibt nicht notwendigerweise einen Zusammenhang zwischen Reihenfolge im Dokument und Position. Darum wird das oft mit OCR gemacht, und wenn man keine Kontrolle über die Erzeugung hat, kann das System auch jederzeit zerfallen, wenn die Generierung geändert wird.
wiesi505
User
Beiträge: 6
Registriert: Donnerstag 27. Januar 2022, 10:29

__deets__ hat geschrieben: Donnerstag 27. Januar 2022, 15:29 @ThomasL: du hast recht, es können auch Texte enthalten sein. Aber of sind das nur grafische Kurven. Und selbst wenn es Texte sind, sind sie anders als bei HTML oft nicht gut zu verarbeiten, es gibt nicht notwendigerweise einen Zusammenhang zwischen Reihenfolge im Dokument und Position. Darum wird das oft mit OCR gemacht, und wenn man keine Kontrolle über die Erzeugung hat, kann das System auch jederzeit zerfallen, wenn die Generierung geändert wird.
Ich weis nicht wie eure Kontoauszüge aussehen aber bei mir sind dort keine Grafiken oder Bilder enthalten. Pro Zeile steht ein Datum, der Empfänger der Überweisung, der Verwendungszweck und der Betrag.
wiesi505
User
Beiträge: 6
Registriert: Donnerstag 27. Januar 2022, 10:29

Erstmal vielen Dank dann muss ich wohl einfach weiter probieren!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

wiesi505 hat geschrieben: Donnerstag 27. Januar 2022, 16:41 Ich weis nicht wie eure Kontoauszüge aussehen aber bei mir sind dort keine Grafiken oder Bilder enthalten. Pro Zeile steht ein Datum, der Empfänger der Überweisung, der Verwendungszweck und der Betrag.
Du hast das Problem nicht verstanden. Es geht nicht darum, dass da Bilder von Palmen drauf sind. Was genau unterscheidet einen senkrechten Strich mit einem Punkt darueber von einem Buchstaben i? Genau, nix. Ein PDF kann so erzeugt sein, dass es einen Font enthaelt, und jeder Buchstabe dann als Klartext im PDF stehen. Oder es steht die Anweisung 'male Linie von da nach da, male Kreis' darin - und dann ist essig mit Text-Extraktion.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

wiesi505 hat geschrieben: Donnerstag 27. Januar 2022, 16:41 Erstmal vielen Dank dann muss ich wohl einfach weiter probieren!
Du gibst aber schnell auf. Sirius3 hatte dir doch gezeigt, wo der Fehler in deinem Programm ist. Hast du den behoben?
Du solltest damit zumindest in der Lage sein, das PDF zu öffnen und Textpassagen zu extrahieren. (Siehe Post von ThomasL)

Falls du deine Kontoauszüge per Post erhältst, und manuell einscannst ist das auch noch nicht schlimm. Es gibt ja zum Beispiel pytesseract um Text aus Grafiken zu extrahieren.
https://pypi.org/project/pytesseract/

Der deutlich einfachere Weg wäre natürlich die Kontoauszüge schon als CSV-Datei aus dem Online- Banking herunterzuladen.
Egal welches Format du letztendlich hast, es ist sicher möglich die Daten daraus zu extrahieren.
wiesi505
User
Beiträge: 6
Registriert: Donnerstag 27. Januar 2022, 10:29

Moin zusammen, weiter gehts es:

ich habe noch etwas rum gebastelt und nun diesen Code erzeugt.

Code: Alles auswählen

import PyPDF2
#import re

file=open('test1.pdf',"rb")
reader=PyPDF2.PdfFileReader(file)
page1=reader.getPage(0)
anzahl_seiten = reader.numPages
print(anzahl_seiten)
pdfData=page1.extractText()
print(pdfData)
In "anzahl_seiten" steht die Anzahl der Seiten des Kontoauszuges
In "pdfData" wird mit der String der PDF ausgegeben

Wenn ich Seite für Seite auslese, mir schwebt da eine for-Schleife vor, soll "anzahl_seiten" als Anzahl der Schleifen dienen.

Der String in "pdfData" sieht so aus es steht alles hintereinander:

Girokonto Nummer 5400000043Kontoauszug April 2018BuchungBuchung / VerwendungszweckBetrag (EUR)Valuta03.04.2018DauerauftragDieter XXXXs-123,0003.04.2018xxxxxxx03.04.2018DauerauftragMichael xxxxxx-75,0003.04.2018Lastschrift VERSICHERUNG AG-17,6503.04.2018versicherung01.04.18-01.05.18Mandat

Alles andere als einfach. Ich hab mir folgendes überlegt. Ich kann den String mit

Code: Alles auswählen

re.search('Dauerauftrag', pdfData)
durchsuchen und bekomm die Position zurück des Wortes "Dauerauftrag" zurück.

Nun meine Frage:
Wie kann ich die 10 Zeichen (das Datum) vor dieser Position in eine Variable=Datum schreiben? Der Plan ist dann, die nächste Position des Inhalts der Variable "Datum" ausfindig zu machen und vor der Position alle Zahlen in eine Variable schreiben.

Um die Zahlen zu finden hab ich schon:

Code: Alles auswählen

print(re.findall(r'[+-]?\d+[,.]?\d*', m_text))
probiert das geht schonmal!


Stück für Stück. Schonmal vielen Dank für die Hilfe
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist genau das Problem, von dem wir hier die ganze Zeit schreiben. In PDF-Dateien sind einzelne Buchstaben gespeichert. Was Wörter oder Absätze sind, ergibt sich nur aus der Position der Buchstaben; das zu interpretieren ist aber kompliziert und macht extractText nicht.
Da mit regulären Ausdrücken drauf loszugehen ist der falsche Weg. Du mußt die Struktur der Zeichenbefehle richtig auswerten.
wiesi505
User
Beiträge: 6
Registriert: Donnerstag 27. Januar 2022, 10:29

Sirius3 hat geschrieben: Samstag 29. Januar 2022, 14:52 Das ist genau das Problem, von dem wir hier die ganze Zeit schreiben. In PDF-Dateien sind einzelne Buchstaben gespeichert. Was Wörter oder Absätze sind, ergibt sich nur aus der Position der Buchstaben; das zu interpretieren ist aber kompliziert und macht extractText nicht.
Da mit regulären Ausdrücken drauf loszugehen ist der falsche Weg. Du mußt die Struktur der Zeichenbefehle richtig auswerten.
Danke für deine Rückantwort dann gib mir nen Tipp. Wie kann ich da ran gehen?

Danke schön
MartinThoma
User
Beiträge: 4
Registriert: Samstag 25. Juni 2022, 11:30

@Sirius3 / @wiesi505: PyPDF2 hat in den letzten Monaten viele Verbesserungen erhalten. Probiere es einfach nochmals - wir sind nun viel besser im extrahieren von Text :-)
Antworten