Textvergleich funktioniert nicht richtig

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
Ajihad
User
Beiträge: 5
Registriert: Montag 11. Januar 2010, 16:23

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]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Ajihad
User
Beiträge: 5
Registriert: Montag 11. Januar 2010, 16:23

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: ).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
Ajihad
User
Beiträge: 5
Registriert: Montag 11. Januar 2010, 16:23

Auch in Ordnung.
Könnte mir aber jemand vielleicht nur für das erste Programm sagen, was dort falsch ist?
Wäre sehr nett.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Ajihad
User
Beiträge: 5
Registriert: Montag 11. Januar 2010, 16:23

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. :)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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 ;))
the more they change the more they stay the same
Ajihad
User
Beiträge: 5
Registriert: Montag 11. Januar 2010, 16:23

Ja, wir lernen da Python, machen aber auch noch ein paar andere Sachen. (steht alles auf unserer Homepage, ist ganz praktisch)
Antworten