Finde den Fehler in meinem Skript nicht

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.
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Finde den Fehler in meinem Skript nicht

Beitragvon Dango » Montag 13. April 2009, 10:29

Hallo liebe Python-Programmierer,
da ich schon in mehreren Fällen hier super Hilfe bekommen habe möchte ich noch mal um etwas Hilfe beten.
Ich bin eigentlich noch ein ziemlicher Anfänger und habe einen kleinen Code geschrieben, der eigentlich .txt Dateien nach dem Caeser-Verfahren einfach verschlüsseln und in einer .caes(wegen CAESar) Datei den Codierten text abspeichern soll. Der Coder sieht so aus :

Code: Alles auswählen

def caesercode(buchstabe):
    klar="abcdefghijklmnopqrstuvwxyz"
    i=klar.index(buchstabe)
    geheim=klar[i:] + klar[:i]
    code={}
    for j in range(len(klar)):
        code[klar[j]]=geheim[j]
    return code
def codiere(text, codedict):
    geheim=""
    for b in text:
        if b in text:
            neu = codedict[b]
        else:
            neu = b
        geheim = geheim + neu
    return geheim
def codiere_datei(dateiname, char):
    f=open(dateiname+".txt")
    text=f.read()
    f.close()
    neu= codiere(text.lower(), caesercode(char))
    g=file(dateiname+".caes","w")
    g.write(neu)
    g.close

So natürlich passier erstma nichts weil ich ja nur Funktionen definiert habe . Aber wenn ich nun den Befehl: codiere_datei("C:\\py4kids\\kap12\\nocheintext","q") eingebe kommt folgende Meldung:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
codiere_datei("C:\\py4kids\\kap12\\nocheintext","q")
File "C:\py4kids\kap12\coden.py", line 22, in codiere_datei
neu= codiere(text.lower(), caesercode(char))
File "C:\py4kids\kap12\coden.py", line 13, in codiere
neu = codedict[b]
KeyError: ' '
Kann jemand den Fehler in meinem Skript finden??
Wenn ja bitte ich darum mir zu zeigen wo und mir zu erklären warum.
Ich bedanke mich schon im Voraus für die Hilfe
MfG
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 13. April 2009, 10:48

Zeile 12 sollte wahrscheinlich

Code: Alles auswählen

if b in codedict:


heißen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Montag 13. April 2009, 10:49

Sollte Zeile 12

Code: Alles auswählen

if b in codedict:
heißen? Dann schau Dir auch mal die get-Methode von dicts an.
MfG
HWK

Edit: Zu spät.
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 13. April 2009, 11:00

Noch ein paar Anmerkungen:

- schau dir mal im String-Modul "ascii_lowercase" an
- dann könnte für dich noch die translate-Methode auf Strings interessant sein, in dem Zusammenhang auch die Funktion "maketrans"
- bei Zuweisungen sollte auf beiden Seiten des Gleichheitszeichen ein Leerzeichen stehen
- wenn du beim Iterieren über eine Liste/String den Index benötigst, dann benutze enumerate

Code: Alles auswählen

for j, k in enumerate(klar):
        code[k] = geheim[j]


oder in diesem Fall:

Code: Alles auswählen

for k, g in zip(klar, geheim):
        code[k] = g

- die "codiere"-Funktion bekommst du gut in einer einzigen List-Comprehension unter, beachte dazu am besten den Tipp von HWK; dazu kannst du dir noch die "join"-Methode auf Strings anschauen
- beim Öffnen/Lesen/Bearbeiten der Dateien solltest du noch mögliche Fehler behandeln, indem du die entsprechenden Exceptions abfängst; je nachdem welche Python-Version du benutzt könnte auch das "with"-Statement für dich interessant sein
- und dann solltest du zum Öffnen von Dateien nur "open" benutzen
Das Leben ist wie ein Tennisball.
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Beitragvon Dango » Montag 13. April 2009, 11:33

Einen RIESEN Dank an euch Beide!
Der Skript läuft nun!
@EyDu Vielen Dank für die Anregungen ich werde versuchen sie zu verstehen ;-)
Noch einmal : Vielen Vielen Dank!!!
MfG
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Beitragvon Dango » Montag 13. April 2009, 13:22

Es hat sich leider doch noch ein Problem gefunden und ich hoffe mir kann da genau so gut geholfen werden wie beim ersten Problem.
Ich hatte mir gedacht man müsse den verschlüsselten Text ja auch wieder entschlüsseln können daher habe ich mein Skript damit ergänzt:

Code: Alles auswählen

def dcaesercode(buchstabe):
    klar="abcdefghijklmnopqrstuvwxyz"
    dc={}
    cc=caesercode(buchstabe)
    for l in klar:
        dc[cc[l]]=l
       
    return dc 

So nun habe ich zur Probe mal mir durch die ganz oben im ersten Beitrag geposteten Funktion caesercode(buchstabe) den Code mit dem Buchstaben "r" generieren lassen. Python spuckt daraufhin diese Dictionary aus :
caesercode("r")
{'a': 'r', 'c': 't', 'b': 's', 'e': 'v', 'd': 'u', 'g': 'x', 'f': 'w', 'i': 'z', 'h': 'y', 'k': 'b', 'j': 'a', 'm': 'd', 'l': 'c', 'o': 'f', 'n': 'e', 'q': 'h', 'p': 'g', 's': 'j', 'r': 'i', 'u': 'l', 't': 'k', 'w': 'n', 'v': 'm', 'y': 'p', 'x': 'o', 'z': 'q'}
Nun nehm ich meine Funktion dcaesercode(buchstabe) und will für diesen Code den decodierungs Code generieren . Dann kommt aber das :
dcaesercode("r")
{'a': 'j', 'c': 'l', 'b': 'k', 'e': 'n', 'd': 'm', 'g': 'p', 'f': 'o', 'i': 'r', 'h': 'q', 'k': 't', 'j': 's', 'm': 'v', 'l': 'u', 'o': 'x', 'n': 'w', 'q': 'z', 'p': 'y', 's': 'b', 'r': 'a', 'u': 'd', 't': 'c', 'w': 'f', 'v': 'e', 'y': 'h', 'x': 'g', 'z': 'i'}
Warum werden die Buchstaben nun GANZ anderen Buchstaben zugeordnet??
Ich hoffe das man mir genau so schnell wie eben helfen kann.
Vielen vielen Dank schon mal im Voraus
MfG
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Spezmanu
User
Beiträge: 6
Registriert: Freitag 10. April 2009, 11:43
Kontaktdaten:

Beitragvon Spezmanu » Montag 13. April 2009, 13:50

soweit ich das gesehen hab, ist das die richtige Decodierung. Dictionaries haben nur die Eigenschaften, dass die Schlüssel keine sortierte Reihenfolge aufweisen.
d.h. wenn du jetzt die Schlüssel sortierst, siehst du auch die Reihenfolge. oder du testest es ganz einfach
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Beitragvon Dango » Montag 13. April 2009, 14:07

Ich habe es einfach mal ausprobiert ob es einfach richtig decodiert wird. Doch der Text, der eigentlich "laber laber test test" heißen sollte heißt nun "rghkx rghkx zkyz zkyz".
Das heißt i-was ist immer noch falsch :-(
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Montag 13. April 2009, 14:31

Zeig mal den gesamten Code, auch den Deines Tests.
MfG
HWK
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

Beitragvon busfahrer » Montag 13. April 2009, 19:17

@Dango

da ich mit Python auch mit dem Buch "Python für Kids" angefangen
habe :wink: ,habe ich hier noch das ein oder andere Übungs-Skript
herum liegen.Vielleicht hilft es dir ja dein Problem zu erkennen
und zu lösen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

# caesarcode.py : Verschluesselt und entschluesselt nach dem Caesarcode.


testtext = "bla bla test test"


def caesarcode(buchstabe):
    klar = "abcdefghijklmnopqrstuvwxyz"
    i = klar.index(buchstabe)
    geheim = klar[i:] + klar[:i]
    code = {}
    for j in range(len(klar)):
        code[klar[j]] = geheim[j]
    return code

def decodedict(codedict):
    dc = {}
    for schluessel, wert in codedict.items():
        dc[wert] = schluessel
    return dc
                   
   

def codiere(text, codedict):
    geheim = ""
    for b in text:
        if b in codedict:
            neu = codedict[b]
        else:
            neu = b
        geheim = geheim + neu
    return geheim


if __name__ == "__main__":
    print "Testtext:"
    print testtext
    print

    cc = caesarcode("r")
    geheimtext = codiere(testtext, cc)

    print "Geheimtext:"
    print geheimtext
    print

    dc = decodedict(cc)
    klartext = codiere(geheimtext, dc)

    print "Klartext:"
    print klartext


Gruß...busfahrer
Alles wird gut ;-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 13. April 2009, 20:48

Was EyDu mit string.ascii_lowercase meinte verdeutlicht dies:

Code: Alles auswählen

import string
klar = string.ascii_lowercase
def foo():
    print klar
foo()


HTH,
Christian
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Beitragvon Dango » Dienstag 14. April 2009, 08:55

Ich bitte um Verzeihung, dass ich nicht früher antworten konnte, aber mein Internet hatte gestern gestreikt :-(
@HWK Mein gesamter coder sieht jetzt so aus :

Code: Alles auswählen

def caesercode(buchstabe):
    klar="abcdefghijklmnopqrstuvwxyz"
    i=klar.index(buchstabe)
    geheim=klar[i:] + klar[:i]
    code={}
    for j in range(len(klar)):
        code[klar[j]]=geheim[j]
    return code
def codiere(text, codedict):
    geheim=""
    for b in text:
        if b in codedict:
            neu = codedict[b]
        else:
            neu = b
        geheim = geheim + neu
    return geheim
def codiere_datei(dateiname, char):
    f=open(dateiname+".txt")
    text=f.read()
    f.close()
    neu= codiere(text.lower(), caesercode(char))
    g=file(dateiname+".caes","w")
    g.write(neu)
    g.close

def dcaesercode(buchstabe):
    klar="abcdefghijklmnopqrstuvwxyz"
    dc={}
    cc=caesercode(buchstabe)
    for l in klar:
        dc[cc[l]]=l
       
    return dc 
               
def dcodiere_datei(dateiname,char):
    f=open(dateiname+".caes")
    text=f.read()
    f.close()
    neu= codiere(text.lower(), caesercode(char))
    g=file(dateiname+".txt","w")
    g.write(neu)
    g.close

Nun dann habe ich den Text "laber laber test test" in der Datei nocheintext.txt mit der Funktion codiere_datei mit dem buchstaben "r" codiert. Dann kam in der .caes datei folgender Text heraus "crsvi crsvi kvjk kvjk". diesen Text habe ich nun mit der Funktion dcodiere_datei Versucht zu decodieren. Der Skript lief doch das ergebnis war eine .txt _ Datei mit dem Inhalt rghkx rghkx zkyz zkyz anstatt dem erwünschtem "laber laber test test".
@busfahrer
Vielen Dank für den Code, doch könntest du mir bitte die 21ste zeile erklären? Ich war lange nicht mehr am Buch ( bzw. an Python) und verstehe nicht ganz wie es möglich ist und was für welche Folgen es hat ,wenn man 2 Sachen mit einem Komma zwischen for und in schriebt.
@CM Vielen Dank!
Vielen Dank noch mal an Alle!!!
MfG
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Spezmanu
User
Beiträge: 6
Registriert: Freitag 10. April 2009, 11:43
Kontaktdaten:

Beitragvon Spezmanu » Dienstag 14. April 2009, 10:55

Muss es in zeile 40 nicht heißen:
neu= codiere(text.lower(), dcaesercode(char))

und in zeile 43 fehlt soweit ich weiß ()
Dango
User
Beiträge: 37
Registriert: Mittwoch 26. November 2008, 15:46
Kontaktdaten:

Beitragvon Dango » Dienstag 14. April 2009, 11:23

@Spezmanu
Vielen vielen Dank!!!! Das waren die Fehler! Mein Skript läuft nun wie er laufen soll !! Danke!!!
Ich denke in anderen Foren hätten sie sich noch nicht mal die Mühe gemacht den Skript so genau nach Fehlern zu durchforsten. Deswegen ein riesiges Danke an ALLE die mir in diesem Thread geholfen haben!
MfG
Dango
ACHTUNG ANFÄNGER!! Ich entschuldige mich im Voraus für dumme Fragen :-(
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 14. April 2009, 12:15

Jetzt könntest du dich erkenntlich zeigen indem du die ganzen Verbesserungsvorschläge im Thread auch umsetzt ;)

Passend dazu gibts auch noch: [wiki]PEP 8 (Übersetzung)[/wiki] und das Orginal

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder