Seite 1 von 1

Textvergleich funktioniert nicht richtig

Verfasst: Montag 11. Januar 2010, 18:27
von Ajihad
Ich habe für jemanden in einem anderen Forum zwei Programme geschrieben, die anzeigen sollen, ob ein Wort aus Datei 1 nicht in Datei 2 enthalten ist, wobei diese Dateien auch alle möglichen Sonderzeichen etc. enthalten. Leider werden auch manche Wörter angezeigt, die in beiden Dateien enthalten sind.
Woran könnte das liegen?

Programm 1:
Das Programm gibt alle Wörter aus, die in Datei 1 aber nicht nicht in Datei 2 enthalten sind:

Code: Alles auswählen

lauf=-1

woerter1=open("woerter1.txt")
woerter1=woerter1.read()
wort1=woerter1.split(" ")

woerter2=open("woerter2.txt")
woerter2=woerter2.read()

for item in wort1:
    lauf=lauf+1
    if item!="*":
        item=item.replace("(", "")
        item=item.replace(")", "")
        item=item.replace(",", "")
        item=item.replace(".", "")
        item=item.replace(":", "")
        item=item.replace(";", "")
        item=item.replace("=", "")
        item=item.replace("!", "")
        item=item.replace("/", "")
        item=item.replace("*", "")
        item=item.replace("\"", "")
        if item not in woerter2:
            print wort1[lauf]
Programm 2:
Das Programm gibt die gesamte Datei 1 aus und markiert die Wörter, die nicht in Datei 2 enthalten sind mit [X]Beispielwort[X].

Code: Alles auswählen

lauf=-1

woerter1=open("woerter1.txt")
woerter1=woerter1.read()
wort1=woerter1.split(" ")

woerter2=open("woerter2.txt")
woerter2=woerter2.read()

for item in wort1:
    lauf=lauf+1
    if item!="*":
        item_alt=item
        item=item.replace("(", "")
        item=item.replace(")", "")
        item=item.replace(",", "")
        item=item.replace(".", "")
        item=item.replace(":", "")
        item=item.replace(";", "")
        item=item.replace("=", "")
        item=item.replace("!", "")
        item=item.replace("/", "")
        item=item.replace("*", "")
        item=item.replace("\"", "")
        if item not in woerter2:
            if "," in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace(",", "")+"[X]"+","
            elif "." in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace(".", "")+"[X]"+"."
            elif ":" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace(":", "")+"[X]"+":"
            elif ";" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace(";", "")+"[X]"+";"
            elif "=" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace("=", "")+"[X]"+"="
            elif "!" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace("!", "")+"[X]"+"!"
            elif "/" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace("/", "")+"[X]"+"/"
            elif "*" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace("*", "")+"[X]"+"*"
            elif "\"" in item_alt:
                wort1[lauf]="[X]"+wort1[lauf].replace("\"", "")+"[X]"+"\""
            else:
                wort1[lauf]="[X]"+wort1[lauf]+"[X]"

trennzeichen=" "

print trennzeichen.join(wort1)

Ich programmiere noch nicht so lange, also ist der Code wohl auch noch nicht so perfekt. :)

Ich hoffe, ihr könnt mir helfen.

MfG Ajihad[/code]

Verfasst: Montag 11. Januar 2010, 18:52
von Hyperion
Hallo,

hier mal ein paar Anregungen:

Ich würde das ganze per RegExp auslesen. Den Vergleich kann man dann per Intersection von zwei Mengen einfach hinbekommen ("-" Operator von set)

Code: Alles auswählen

In [20]: import re

In [21]: text = u"Hallo Welt, das ist ein **Text**"

In [22]: words = re.findall("[A-Za-z]+", text)

In [24]: words
Out[24]: [u'Hallo', u'Welt', u'das', u'ist', u'ein', u'Text']

In [28]: a = set(words)

In [29]: b = set((u"Hallo", u"Welt", u"Python"))

In [30]: a - b
Out[30]: set([u'Text', u'das', u'ein', u'ist'])
Das Öffnen von Dateien würde ich in eine Funktion auslagern, die sich dann um Exceptions kümmert und mit "with" arbeitet.

Verfasst: Montag 11. Januar 2010, 19:38
von Ajihad
OK, vielen Dank.
Ich werd mich mal damit befassen.
Mich würde noch interessieren, was an meinen Programmen falsch ist (auch wenn sie nicht sonderlich gut sind :lol: ).

Verfasst: Montag 11. Januar 2010, 19:51
von Hyperion
Ajihad hat geschrieben: Mich würde noch interessieren, was an meinen Programmen falsch ist (auch wenn sie nicht sonderlich gut sind :lol: ).
Da sie eben "nicht sonderlich gut" sind, habe ich ehrlich gesagt wenig Lust, mich damit auseinander zu setzen ;-)

Verfasst: Montag 11. Januar 2010, 20:26
von Ajihad
Auch in Ordnung.
Könnte mir aber jemand vielleicht nur für das erste Programm sagen, was dort falsch ist?
Wäre sehr nett.

Verfasst: Montag 11. Januar 2010, 21:19
von cofi
Du brauchst keine Laufvariable. Bzw hier macht es dir evtl. Probleme.
Zeile 25:

Code: Alles auswählen

print item
Aber das ist auch nur ins Blaue geraten: Mehr Infos!

Verfasst: Montag 11. Januar 2010, 21:25
von Hyperion
Die Frage ist halt, wieso ich an einem in sich kaputten Code noch den "Fehler" finden soll - einen schlecht konzipierten Aufsatz sollte man auch besser noch einmal komplett neu schreiben ;-)

Ich würde noch vermuten, dass Du evtl. noch Whitespaces drin hast? Schließlich behandelst Du die in woerter2 nicht...

Aber wie schon gesagt: Das ganze ist extrem schlecht umgesetzt. Ich würde Dir raten vergiss den Ansatz und versuche den Ansatz über RegExps. Meine Fragmente musst Du ja eigentlich nur noch ein wenig verpacken...

Verfasst: Dienstag 12. Januar 2010, 00:33
von jbs
Wenn du 11x ``item=item.replace`` hintereinander aufrufst, würde ich stark von Redundanzen sprechen und von schlechtem Design ;)

Ich sag mal Kopf hoch und viel Spaß mit Python!

Wenn du magst (es empfiehlt sich) kannst du mal das Tutorial und PEP 8 lesen. Findest du alles in cofis Signatur.

Edit: Ich sehe gerade, ich habe es bei mir auch eingefügt.

Verfasst: Dienstag 12. Januar 2010, 19:22
von Ajihad
Vielen Dank euch drei!
Ich hab die Programme jetzt nochmal neu geschrieben, allerdings erstmal ohne RegExp, damit ich sie schonmal habe. Funktioniert jetzt auch alles soweit. Ich werde das aber auf jeden Fall nochmal mit RegExp machen, einfach zum Lernen.
Bis jetzt habe ich das Tutorial A Byte of Python (fast) ganz durchgearbeitet, das ist allerdings schon etwas her und zwischendrin hatte ich auch nicht besonders viel zu Programmieren. Außerdem bekommen wir Informatik auch leider erst in der Oberstufe. :cry:
@jbs Das Tutorial sieht gut aus, danke dafür. Wenn ich Zeit hab, werde ich es wohl durchlesen/anwenden.

Ist hier ja echt eine sehr aktive Community, spricht auf jeden Fall für Python. :)

Verfasst: Dienstag 12. Januar 2010, 19:48
von Dav1d
Ajihad hat geschrieben:Außerdem bekommen wir Informatik auch leider erst in der Oberstufe.
Lernt ihr da Python?
ich werde nicht Python lernen sondern sollte eigentlich nach dem Jahr Java können (nur dass ich kein Informatik habe ;))

Verfasst: Dienstag 12. Januar 2010, 20:20
von Ajihad
Ja, wir lernen da Python, machen aber auch noch ein paar andere Sachen. (steht alles auf unserer Homepage, ist ganz praktisch)