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
Kontoauszug (pdf) mit Python auslesen
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.
Zu deinem Problem: du musst die Funktion auch aufrufen. Nur path zuweisen reicht nicht.
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:
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.
\ 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")
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.
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
@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.__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.
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.
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.
Moin zusammen, weiter gehts es:
ich habe noch etwas rum gebastelt und nun diesen Code erzeugt.
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 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:
probiert das geht schonmal!
Stück für Stück. Schonmal vielen Dank für die Hilfe
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 "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)
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))
Stück für Stück. Schonmal vielen Dank für die Hilfe
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.
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?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 schön
-
- 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