Anfängerfrage zu .split Funktion auf gewöhnlichen Text

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
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Hey ich habe ein Problem und raff es einfach nicht fürchte ich:


Hier zunächst mal ein bild wie es in der Konsole auschaut:
Bild

Ich möchte lediglich von diesem Text, der einer .pdf extrahiert wurde, einen Textschnipsel extrahieren. Bisher hat das auch ganz wunderbar geklappt, z.B.:

Code: Alles auswählen

quecksilber_A_raw = pageObj_A.split('Quecksilber0,1')[1]
            quecksilber_A_raw = quecksilber_A_raw.split('DIN EN ISO 11885')[0]
So konnte ich viele Dinge extrahieren. Doch wenn ich das Folgende versuche, gehts auf einmal nicht mehr, er hat Probleme zwischen naphtalin und 0,01 - vllt. eiN Zeichen, welches ich nicht sehe o.a.? :

Code: Alles auswählen

naph_A_raw = pageObj_A.split('Naphtalin0,01')[1]
            naph_A_raw = naph_A_raw.split('DIN EN ISO 11885')[0]
Fehler:

IndexError: list index out of range,
naph_A_raw = pageObj_A.split('Naphtalin0,01')[1]




Aber wieso denn ? Das is doch einfach nur zusammengeklitschter Text, den ich versuiche ganz stumpf von einander zu trennen :( Hat jemand nen Rat?
Zuletzt geändert von maow am Samstag 15. Mai 2021, 18:11, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Text ist halt nicht drin. Ohne den wirklichen Text vorliegen zu haben (zb ueber pastebin) kann man da auch nix zu sagen.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

__deets__ hat geschrieben: Samstag 15. Mai 2021, 17:57 Der Text ist halt nicht drin. Ohne den wirklichen Text vorliegen zu haben (zb ueber pastebin) kann man da auch nix zu sagen.
Man sieht doch am Bild bereits das der Text "Naphtalin0,01" Bestandteil des Textes ist.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@maow: `"Naphtalin0,1"` ist halt was anderes als `"Naphthalin0,01"`. Das sieht allerdings schon ein bisschen komisch aus, was du da mit `split` machst.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

narpfel hat geschrieben: Samstag 15. Mai 2021, 18:03 @maow: `"Naphtalin0,1"` ist halt was anderes als `"Naphthalin0,01"`. Das sieht allerdings schon ein bisschen komisch aus, was du da mit `split` machst.
Ich bin Anfänger. Ja gut 0,01 0,1 wie auch immer. das schon klar, das war nur ein typo hier im Forum. Die Quintessenz kam bestimmt durch was ich gemeint hatte, und eben genau das was ich da bisher getan hatte funktioniert weiterhin nicht.

Mein allgemeines Problem ist eben eine PDF zu extrahieren. Das ist in dem Fall eben auch so, dass ich besagte .pdf auch nicht einfach so irgendwo hochladen kann, da geheim. Und ich weiß auch nix von pastebin oder schieß mich tot . Ich bin Anfänger, dass bedeutet, dass man allgemein davon ausgehen kann, dass ich am Anfang stehe, also jemand, der von diesen Dingen ansich nich viel bis gar nix weiß und dessen Code etwa so ausschaut, wie als man selbst am Anfang war :(.

Die einzige Möglichkeit die ich aktuell habe ist es also eben euch den Screenshot zu zeigen. Meiner Meinung nach sieht man eben schon bereits in der Konsole, dass da sich was ändert. Plötzlich werden die Zeilen doch anders ausgegeben. Und sicher gibt es hier erfahrene Leute, die wissen wieso das so sein kann. Wende ich das z.B. auf Kohlenwasserstoffe an, also 'Kohlenwasserstoffe50' habe ich genau das gleiche Problem :( Bei Zink0,2 geht es .. dazwischen (siehe Screenshot), irgendwo ändert sich die Consolenausgabe) - die Frage ist - wieso und wie berücksichtige ich das?

Klar, wäre ich jetzt erfahrener in Python, würde ich an all die zig Möglichkeiten denken, die man eben so hat, als Erfahrener. Dann wäre ein pastebin da, was auch immer das ist, ich hätte vielleicht diese Variable einfach in eine .txt geschrieben und mir die mal angeschaut oder so - aber ich weiß nichtmal wie sowas geht. Daher hoffe ich hier darauf, dass es hier Jemanden gibt, der ggf. Erfahrung hat und weiß woran es liegen könnte (an Stelle jetzt meinen 'komischen Code' zu hinterfragen - es ist eben Anfängercode ).

Vermutlichist es ja total einfach irgendwelche Variablen und die dazugehörigen Werte aus einer .pdf auszulesen und ihr tippt das im Schlaf runter. Bisher habe ich keine andere Lösung gefunden und die auch soweit eben erfolgreich anwenden können, daher wäre ich für Hilfe sehr dankbar.

Danke im Voraus :)

Hier mal kurz wie ich zu den komischen split-Dingen komme:

Code: Alles auswählen

pdfReader = PyPDF2.PdfFileReader(single_file)
            pageObj = pdfReader.getPage(1)
            pageObj_A = pageObj.extractText()
Also das nutze ich anfangs um mir eine bestimmte pdf.Seite geben zu lassen. Da steht nun aben viel Text und den zerschnipsel ich.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Ich glaube es ist einfach ein \n. Ich teste gerade. Wäre ja witzig, denn es wäre die einfachste Lösung. Ein Zeilenumbruch, der in der Konsole so ausgegeben wird, zumindest im Fall der Kohlenwasserstoffe. Es funktioniert weiterhin nicht bei Naphtalin :(
Zuletzt geändert von maow am Samstag 15. Mai 2021, 18:38, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Poste den Text, in dem du suchst.
Poste den Code, den du verwendest.
Das verhindert "Typos hier im Forum", die zufällig genau deinen Fehler entsprechen.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

sparrow hat geschrieben: Samstag 15. Mai 2021, 18:36 Poste den Text, in dem du suchst.
Poste den Code, den du verwendest.
Das verhindert "Typos hier im Forum", die zufällig genau deinen Fehler entsprechen.
Sobald ich den text hier aus der pdf heraus einfach Poste, sieht das völlig anders aus und mein Code liese sich, so wie er im Script steht, nicht darauf anwenden.

Ich habe jetzt bestimmt 2 Stunden daran gesessen - es ist kein Typo. Es ist ein versteckstes Zeichen o.a. - in dem Sinne wäre es ein Typo. Aber es handelt sich um eine PDF. WIe soll ich denn bitte ne PDF posten ? o0 In dem Fall sogar ein nicht öffentliches Dokument - das ich auch nicht veröffentlichen werde. Daher die Ausgabe als Screenshot, da sieht man, dass sich da was ändert. Aber wie gesagt - selbst wenn ich versuche den Text der PDF zu kopieren, ist die Syntax komplett anders, was dann so ausschaut :

Nickel 8,0 mg/kg TS 0,5 DIN EN ISO 11885
Quecksilber u.d.B. mg/kg TS 0,1 DIN EN ISO 12846
Zink 31 mg/kg TS 0,2 DIN EN ISO 11885
EOX u.d.B. mg/kg TS 0,5 DIN 38414-17
Kohlenwasserstoffe u.d.B. mg/kg TS 50 DIN EN 14039
Naphthalin u.d.B. mg/kg TS 0,01 DIN ISO 18287
Acenaphthylen u.d.B. mg/kg TS 0,01


( da steht nix mehr von Quecksilber0,1 z.B.). Der Code lies sich immer 1:1 genauso wie die Ausgabe auf dem Screenshot anwenden. Die Extraktion des PDF-Seiteninhaltes zerwirft (!) mir den Text. Copy Paste hat damit keinen Sinn.?!)

Zu dem Code den ich verwende:

es kommt nur auf die initiale Zeile mit der .split an, s.o. Den anderen Schnipsel habe ich lediglich gepostet um zu zeigen, dass ich eine PDF extrahiere.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

Habe es gelöst, danke für die Hilfe..
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@maow: `"Naphtalin0,01"` ist immer noch was anderes als `"Naphthalin0,01"`. 😉

PDFs zu verarbeiten ist immer unschön, weil PDFs für Menschen zum Lesen gedacht sind und nicht für Computer. Unter anderem, weil (wie du gerade bemerkst) im PDF nicht die Struktur des Dokuments (in deinem Fall eine Tabelle) beschrieben ist, sondern die Seite nach dem Muster „schreibe Text $foo an Position $bar“ aufgebaut ist.

Mein erster Ansatz wäre, mich darum zu bemühen, die Daten in einem besser maschinenlesbaren Format zu bekommen, zum Beispiel als CSV-Datei. Wenn das nicht geht, dann wird dir nichts anderes übrig bleiben, als die Daten aus diesem komischen Text herauszuparsen. Ohne das Originaldokument zu kennen sieht der manuell kopierte Text „besser“ (weniger zerwürfelt und mehr nach einer Tabelle) aus als das, was dein Programm extrahiert. Eventuell macht es also Sinn, nach einer Alternative zu `PyPDF2` zu suchen, die die Struktur besser erhält.

Du scheinst Text zu suchen, der zwischen zwei Begrenzern steht? Das wird nicht ganz klar aus den Beispielen, die du machst. `"DIN EN ISO 11885"` kommt in deinem ersten Beispiel zum Beispiel gar nicht hinter `"Naphthalin0,01"` vor und im zweiten Beispiel ist da eine andere Norm angegeben. Wenn dem so ist: Das kann man mit `str.split` machen (das ist aber eigentlich nicht dazu gedacht), oder `str.index`, oder (vielleicht am einfachsten) mit `re.search`:

Code: Alles auswählen

In [1]: import re

In [2]: re.search(
   ...:     "Naphthalin0,01(.*?)DIN EN ISO 11885",
   ...:     "irgendein TextNaphthalin0,01u.d.B.mg/kg TSDIN EN ISO 11885weiterer Text",
   ...: ).group(1)
Out[2]: 'u.d.B.mg/kg TS'
Ich kann mich nur sparrow anschließen: Wenn du nicht den tatsächlichen Code, die tatsächlichen Eingabedaten und die tatsächliche Fehlermeldung zweigst, können wir nur im Nebel stochern.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

narpfel hat geschrieben: Samstag 15. Mai 2021, 18:59 @maow: `"Naphtalin0,01"` ist immer noch was anderes als `"Naphthalin0,01"`. 😉
Das habe ich auch nicht ausgeschlossen. Gut danke dennoch.
maow
User
Beiträge: 29
Registriert: Mittwoch 24. Februar 2016, 16:30

narpfel hat geschrieben: Samstag 15. Mai 2021, 18:59 Du scheinst Text zu suchen, der zwischen zwei Begrenzern steht? Das wird nicht ganz klar aus den Beispielen, die du machst. `"DIN EN ISO 11885"` kommt in deinem ersten Beispiel zum Beispiel gar nicht hinter `"Naphthalin0,01"` vor und im zweiten Beispiel ist da eine andere Norm angegeben. Wenn dem so ist: Das kann man mit `str.split` machen (das ist aber eigentlich nicht dazu gedacht), oder `str.index`, oder (vielleicht am einfachsten) mit `re.search`:

Code: Alles auswählen

In [1]: import re

In [2]: re.search(
   ...:     "Naphthalin0,01(.*?)DIN EN ISO 11885",
   ...:     "irgendein TextNaphthalin0,01u.d.B.mg/kg TSDIN EN ISO 11885weiterer Text",
   ...: ).group(1)
Out[2]: 'u.d.B.mg/kg TS'
Ich kann mich nur sparrow anschließen: Wenn du nicht den tatsächlichen Code, die tatsächlichen Eingabedaten und die tatsächliche Fehlermeldung zweigst, können wir nur im Nebel stochern.
Hey ich bin das mit dem split so angegangen, da ich verschiedene Dinge um den begriff Naphtalin gesucht habe, z.B. u.d.B oder aber auch eben das, was zwischen der besagten DIN und Naphtalin steht (also die Einheit).

Klar könnte ich das irgendwie anders angehen, aber ich bin halt Anfänger. Da kam ich auf diese Art die PDF zu extrahieren. Ich wusste nichtmal wie man das in eine csv umwandelt, geschweige denn was eine csv iost oder wieso das besser sein sollte. Weißt du, und wenn man das nicht weiß, machts einem nich heiß ^^. Danke soweit.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@maow: Wenn du dir das Leben erleichtern willst: Hier und hier.

Aber schön, dass du dein Problem (ohne unsere Hilfe?) lösen konntest. War ja anscheinend nicht der doppelte Typo. 🙃

„Ich bin Anfänger“ ist übrigens kein Grund dafür, nichts neues lernen zu wollen. Alle (?) gut gemeinten Ratschläge mit „ich bin Anfänger“ zu beantworten, bringt dich nicht unbedingt weiter.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

maow hat geschrieben: Samstag 15. Mai 2021, 17:58
__deets__ hat geschrieben: Samstag 15. Mai 2021, 17:57 Der Text ist halt nicht drin. Ohne den wirklichen Text vorliegen zu haben (zb ueber pastebin) kann man da auch nix zu sagen.
Man sieht doch am Bild bereits das der Text "Naphtalin0,01" Bestandteil des Textes ist.
Man sieht, dass in der DARSTELLUNG des Textes Napthatlin0,01 Bestandteil des Textes ist. Als erfahrener Programmierer weiss man aber, dass das nicht unbedingt der Repraesentation in den Daten entspricht. Darum fragt man dann danach.

Und dann scheinst du dem Irrglauben zu erliegen, dass das Wort "Anfaenger" irgendeine magische Wirkung entfaltet. Naemlich irgendwie praezise zu umschreiben, was du weisst. Und was nicht. Dem ist aber nicht so. Ich weiss nicht, ob du pastebin kennst. Ich weiss auch nicht, ob du weisst, wo man einen Computer anschaltet, oder eine Wasserspuelung benutzt. Ich koennte also hier locker 30 Seiten schreiben, in denen ich dir vom morgendlichen Unterhosenwechsel bis zum oeffnen eines Editors alles haarklein erklaere. Und dabei immer noch die Haelfte nicht erwaehnt habe. Das ist aber eine ziemliche Verschwendung meiner Zeit, und darum wird das nicht passieren.

Wenn dir also jemand einen Begriff nennt, den du nicht kennst, dann ist die Reaktion "WAS HEISST DAS, ICH KENNE DAS NICHT, ICH BIN AAAAANFAAAAAENNGEEEER" eher unguenstig. Dann googelt man den Begriff, und findet heraus, das man damit binaere Dateien teilen kann. Und das beantwortet dann so Fragen wie
WIe soll ich denn bitte ne PDF posten ?
. Was uebrigens auch niemand verlangt hat. Sich darueber dann zu echauffieren, wie unverschaemt diese Forderung ist, ist also ein bisschen fehl am Platze.

Wenn du Hilfe willst, ist es an dir, ausreichend viel Informationen beizutragen. Und sich dabei auch Muehe zu geben, Dinge zu verstehen, oder sich zu erarbeiten. Isso. Auch bei ANFAENGERN.
Antworten