Fehler beim Einfügen von viel Text in input() und Einlesen von .odt und .docx-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
linn29
User
Beiträge: 3
Registriert: Dienstag 20. Oktober 2020, 16:13

Hey,

ich bin relativ neu bei Python und probiere gerade ein Programm zu schreiben, welches aus einer wissenschaftlichen Textdatei mit langen Buchstabenketten bestimmte Textsequenzen herausfindet und druckt. Da es bei mir nicht funktioniert, die Datei (.odt, bzw. .docx) zu öffnen und im Programm mit open(filename, read) auszulesen, da es soweit ich es bisher mitbekommen habe nur mit .txt-Dateien funktioniert, wollte ich es mit input() und copy/paste machen. Falls es doch Methoden gibt, .docx-Dateien auszulesen, bin ich über jede Anregung sehr froh.

Gerade sieht der Code noch so aus:

Code: Alles auswählen

input_datei = ""
while True:
    input_datei += input()
    if input_datei.endswith("\n"):
        break
    else:
        input_datei += ("\n")
Bei dem Code liegt mein Problem darin, dass ich nicht den kompletten Dateiinhalt (der ca. 40 Seiten umfasst) in input() einfügen kann (mit copy-paste aus der .odt, bzw. docx. Datei), da nach einer bestimmten Anzahl an Zeichen das Eingefügte irgendwie automatisch in das nach dem Code kommenden input() eingefügt wird und das Programm ohne eine erneute Bestätigung der Eingabe (drücken der Entertaste) startet. Dadurch habe ich nicht mehr die Möglichkeit, in das weitere input() das Erforderliche einzutragen und das Programm gibt mir folglicherweise immer früher oder später Fehler aus.

Ich hoffe, ich habe mein Problem verständlich beschrieben und würde mich sehr freuen, wenn mir jemand sagen könnte, was an dem Code falsch ist oder was noch hinzugefügt werden muss, damit in input() mehr Text eingefügt werden kann.

Vielen Dank im Vorraus!
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@linn29: So wie die Logik dort beschrieben steht beendet die erste Leerzeile diese Schleife auch wenn danach noch Text kommt. Wenn in dem Text in der Zwischenablage Leerzeilen vorkommen können, dann kann man das so nicht als Kriterium für das Textende verwenden.

Es ist auch komisch/umständlich ausgedrückt. Wenn man nicht auf "\n" am Ende vom bisher gesammelt Text testet, sondern direkt die Eingabe ob die leer war, ist das Problem auch deutlicher zu sehen. Der Code ist äquivalent zu:

Code: Alles auswählen

    text = ""
    while True:
        line = input()
        if not line:
            break
        text += line + "\n"
Ich habe `input_datei` mal in `text` umbenannt, denn bei einem Namen mit `datei` am Ende würde man eine *Datei* erwarten. Also ein Objekt mit einer `read()`- und/oder `write()`-Methode und einer `close()`-Methode.

Was an dem Code dann immer noch ”unpythonisch” wäre ist das wiederholte erweitern einer Zeichenkette per ``+``/``+=`` denn das ist ineffizient weil Zeichenketten nicht veränderbar sind, und so in jedem Schleifendurchlauf mehr und mehr Daten im Speicher umherkopiert werden müssen. Idiomatisches Vorgehen ist das Sammeln der Zeilen in einer Liste und die dann am Ende mit der `join()`-Methode auf Zeichenketten zu verbinden:

Code: Alles auswählen

    lines = list()
    while True:
        line = input()
        if not line:
            break
        lines.append(line + "\n")
    text = "".join(lines)
Das ganze lässt sich kürzer mit Hilfe von `sys.stdon`, der `iter()`-Funktion, und einem Generatorausdruck lösen:

Code: Alles auswählen

import sys

...

    text = "".join(line + "\n" for line in iter(sys.stdin, ""))
Problem ist natürlich weiterhin, dass die erste Leerzeile das einlesen beendet. Wenn Leerzeilen in der Eingabe vorkommen können und dürfen, dann muss man sich etwas anderes als Endkennzeichen ausdenken was im normalen Text nicht vorkommen kann. Und auf das prüfen und es am Ende des Textes manuell eingeben.

Zum Verarbeiten von *.odt- und *.docx-Dateien gibt es Module von Drittanbietern. Wie einfach oder kompliziert es ist da dann den gewünschten Text zu extrahieren müsstest Du schauen. Also ob sich das vom Aufwand lohnt vs. wie umständlich das mit dem manuellen kopieren über die Zwischenablage ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
linn29
User
Beiträge: 3
Registriert: Dienstag 20. Oktober 2020, 16:13

@__blackjack__:

Code: Alles auswählen

import sys

...

    text = "".join(line + "\n" for line in iter(sys.stdin, ""))
Vielen Dank für die ausführliche Antwort!!! Dieser Code hat bei mir perfekt funktioniert und mein Problem gelöst...
Antworten