Wörter aus .txt filtern und anzeigen(Python Neuling)

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
Lucas15
User
Beiträge: 5
Registriert: Donnerstag 14. Mai 2020, 08:32

Hallo zusammen,

ich hoffe, ich werde jetzt nicht auf der Stelle gelyncht, aber ich konnte leider nichts zu diesem Thema finden...

ich habe eine Textdatei, darin eine einzige ellen lange Zeile mit verschiedenen Informationen.

Aufbau ungefähr so :

<Values><Standardname_Variablenname1 Item="Standardname.Variablenname1" Type="4" Hex="420C0000" Value="35"

Dieses wiederholt sich immer wieder., wobei der "Standardname" immer gleich bleibt, der "Variablenname" und die Werte sich verändern.

Ich möchte nun eine Ausgabe bzw. eine neue Textdatei, in der ich nur noch die für mich wichtigen Informationen habe:

Item="Standardname.Variablenname1" Value="35"

Habt ihr Tipps für mich, mit welchen Befehlen ich dieses Ergebnis erzeugen kann?

Lg Lucas
Zuletzt geändert von Lucas15 am Donnerstag 14. Mai 2020, 09:37, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit "ungefaehr so" kann man nicht programmieren. Computer brauchen's schon sehr genau. Bitte zeig uns ein echtes Dokument dieser Art, nur dann kann man dir weiterfuehrende Tipps geben.

lynchen schreibt man mit y. Orthographie ist mir ueblicherweise schnurz, aber da zuckt das Augenlid ;)
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Grundsätzlich hoffe ich, dass es ein "Standardname" und kein "Standartname" ist. Eine Standarte ist etwas anderes.

"Aufbau ungefähr so" nützt nichts. Zeig den Anfang der Datei bis zum Ende der kompletten beiden ersten Datensätze. Und zwar so, wie er da steht und nicht "ungefähr" wie er da steht. Das sieht wie eine Markup-Language aus, und dafür gibt es ggf. fertige Module.
Lucas15
User
Beiträge: 5
Registriert: Donnerstag 14. Mai 2020, 08:32

Ich entschuldige mich natürlich auch für meine gruslige Rechtschreibung...

Ich kann die Datei leider nicht einfach 1:1 hier veröffentlichen, da ich sonst Probleme mit meinem Arbeitgeber bekommen könnte...

Ich habe allerdings nur die Variablennamen ersetzt, der Rest ist aus der Datei kopiert.

Ich möchte auch keine fertigen Lösungsvorschläge, sondern nur Ansätze. Ich habe aktuell dank Corona die Zeit mich mit neuen Sprachen zu beschäftigen und das versuche ich auch.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Nochmal: Es nützt nichts, wenn die Datei nur "ungefähr so" aussieht.
Änder halt alle spezifischen Daten in dem Beispiel. Aber wenn wir das Format nicht sehen, können wir nicht helfen.
Das sieht aus wie eine Markup-Language, aber um das zu sehen reichen nicht die ersten x Zeichen sondern zumindest ein kompletter Datensatz. Und der ist dort vorbei, wo der zweite beginnt.
Und welche Markup-Language das ist, steht meist am Anfang der der Datei.
Deshalb wäre der Anfang der Datei (der DATEI nicht des Datensatzes) bis zum Ende des ersten Datensatzes nötig.
Zuletzt geändert von sparrow am Donnerstag 14. Mai 2020, 09:48, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

sparrow hat es schon gesagt: die Antwort unterscheidet sich substantiell, abhaengig davon, wie konkret das Format aussieht. Wenn du Probleme befuerchtest, kannst du entweder mit deinem Arbeitgeber klaeren, ob eine Veroeffentlichung ok ist, oder die Daten unkentlich machen. Wobei du dabei natuerlich aufpassen musst, dass du das Format nicht verhackstueckst.

Wenn das nicht moeglich ist, dann gibt es eben die ueblichen Verdaechtigen - String-Operationen, XML-Bibliotheken, 3rd-Party-Libraries wenn es ein bekanntes Format ist. Was davon zutrifft - siehe oben.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sieht nach XML aus.
Zeilenweise kannst du das Dokument nicht verarbeiten, du wirst dich mit XML auseinandersetzen müssen.

Hier mal ein Beispiel:

Code: Alles auswählen

import xml.etree.ElementTree as ET

xml_string = '''<Values>
  <Standardname_Variablenname1 Item="Standardname.Variablenname1" Type="4" Hex="420C0000" Value="35" />
  <Standardname_Variablenname2 Item="Standardname.Variablenname1" Type="4" Hex="420C0000" Value="35" />
  <Standardname_Variablenname3 Item="Standardname.Variablenname1" Type="4" Hex="420C0000" Value="35" />
  <Standardname_Variablenname4 Item="Standardname.Variablenname1" Type="4" Hex="420C0000" Value="35" />
</Values>'''

doc = ET.fromstring(xml_string)


results = []
for item in doc:
    data = {
        "item": item.get("Item", "-empty-"),
        "type": int(item.get("Type", 0)),
        "hex": int(item.get("Type", 0), 16),
        "value": int(item.get("Value", 0)),
        }
    if data["hex"] != data["type"]:
        print("Inkonsistenter Datensetz:", data)
        continue
    results.append(data)

Wenn du keine Daten veröffentlichen kannst, bist du auf dich allein gestellt.
Beispiele wie man XML mit Python verarbeitet, gibt es aber ganz viele.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lucas15: es sieht aus wie XML, daher kannst Du einfach mal versuchen, die Datei mit xml.etree.ElementTree zu laden. Wie das geht, steht in der Dokumentation.
Wenn die Tagnamen wirklich alle unterschiedlich sind, weil irgendein Laie das so definiert hat, bleibt Dir wohl nichts anderes übrig als alle Child-Tags unter <Values> durchzugehen und die benötigte Information aus den Attributen zu ziehen.
Lucas15
User
Beiträge: 5
Registriert: Donnerstag 14. Mai 2020, 08:32

Also:

Erst einmal vielen Dank für die hilfreichen antworten.

Ich bin nicht aus dem Informatik-Bereich, deshalb entschuldigt bitte meine unbedarfte Art...

Im Original handelt es sich um eine RF-Datei. Mir liegt allerdings ein Textdokument (.txt) mit dem Inhalt vor.
Ich möchte aus diesem Text einfach nur meine Informationen heraus lesen.

Meine Idee war, den Text nach Item=" und Value=" zu durchsuchen und den gesamten Text danach bis zum " anzuzeigen.

Dafür müsst ihr mir aber auf die Sprünge helfen :D
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist eine RF-Datei?
Lucas15
User
Beiträge: 5
Registriert: Donnerstag 14. Mai 2020, 08:32

Ein Bildformat meine ich, was ja auch eigentlich egal ist, da ich ich den Code in einer Textdatei habe.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das beantwortet nicht die Frage, ob es sich wirklich um ein Textdokument handelt, oder doch vielleicht eher um eine XML-Datei? Hast Du denn das schon geprüft?
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Lucas15 hat geschrieben: Donnerstag 14. Mai 2020, 10:45 Ein Bildformat meine ich, was ja auch eigentlich egal ist, da ich ich den Code in einer Textdatei habe.
Wenn nur die Dateiendung von rf zu txt geändert wurde, hast du weiterhin eine rf-Datei, nur halt mit einer "falschen" Endung. Eine Änderung der Endung bewirkt keine implizite Konvertierung oder sowas. Dateiendungen sind nur ein Hilfsmittel (zum Beispiel für das Betriebssystem) und für den Dateiinhalt bedeutungslos.

Wenn du wirklich nicht mehr zeigen kannst, und auch keine Auskunft geben kannst, mit welchem Programm die Datei erzeugt wurde, ist der Vorschlag von Sirius3 meiner Meinung nach im Moment am Besten: probier, ob die Datei mit einem XML Parser gelesen werden kann.
Lucas15
User
Beiträge: 5
Registriert: Donnerstag 14. Mai 2020, 08:32

Die Textdatei wurde von mir erstellt und ist eine Textdatei.

Angenommen: Wenn ich eine Textdatei.txt habe, in der ein langer Text ist und ich in diesem Text zwei bestimmte Wörter suche die ich danach zusammen mit dem jeweils darauf folgenden Wort anzeigen will...

So als Beispiel:

"Und der Fehler? Rote Beete hat mit einem Beet nichts zu tun; Rote Beete bitte! Dachte ich. Und schaute noch mal im Duden nach, der mich sanft ohrfeigte."

Nun möchte ich den Begriff "Rote Beete" und jeweils das mir unbekannte Wort, welches danach steht anzeigen....diese Funktion/diesen Befehl möchte ich wissen :)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Also eine rf-Datei ist eine FrameMaker Datei. FrameMaker "bietet auch eine gute Unterstützung für die Erstellung von SGML- und XML-Dokumenten." Deshalb vermute ich das es sich hier um eine XML Datei handelt, die mit dem FrameMaker erstellt wurde.

Quelle: https://de.wikipedia.org/wiki/FrameMaker
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Lucas15 hat geschrieben: Donnerstag 14. Mai 2020, 12:29 Die Textdatei wurde von mir erstellt und ist eine Textdatei.
Wie hast du die Textdatei aus der Vorlage erstellt?

Der erste Schritt bei so einer Aufgabe ist immer, zu schauen, ob es einen Parser für das Format gibt. Wenn es sich um XML handelt, ist der Ansatz mit Zeichenkettenoperationen, für den du gerne eine Erklärung hättest ungenügend, weil man XML so nicht verarbeiten sollte. Daher passt dein zweites Beispiel auch nicht, denn wenn du eine Erklärung, die für dieses zweite Beispiel passt, auf das erste anwendest, ist das relativ wahrscheinlich falsch.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Lucas15 hat geschrieben: Donnerstag 14. Mai 2020, 12:29 Die Textdatei wurde von mir erstellt und ist eine Textdatei.

Angenommen: Wenn ich eine Textdatei.txt habe, in der ein langer Text ist und ich in diesem Text zwei bestimmte Wörter suche die ich danach zusammen mit dem jeweils darauf folgenden Wort anzeigen will...

So als Beispiel:

"Und der Fehler? Rote Beete hat mit einem Beet nichts zu tun; Rote Beete bitte! Dachte ich. Und schaute noch mal im Duden nach, der mich sanft ohrfeigte."

Nun möchte ich den Begriff "Rote Beete" und jeweils das mir unbekannte Wort, welches danach steht anzeigen....diese Funktion/diesen Befehl möchte ich wissen :)
Da würde ich das mit RegEx machen, aber trotzdem würde ich eher zusehen dass ich einen passenden Parser für deine Struktur finde.

Wie von Sirius3 beschreiben würde ich mal versuchen das ganze mit xml.etree.ElementTree zu laden
Zuletzt geändert von Jankie am Donnerstag 14. Mai 2020, 12:51, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@Lucas15: Das Problem haben wir verstanden. Dein Lösungsansatz ist nur leider falsch.
Wenn es sich um XML handelt, solltest du einen entsprechenden Parser verwenden. XML ist eben nicht nur Text, sondern eine Struktur. Und die sollte man auch benutzen.

Und wie man das macht, steht hier sogar schon im Thread.
Antworten