txt-auslese fehler

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.
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

ich hab ein latein vokabelprogramm gemacht, dass einem immer die übersetzung angibt

Code: Alles auswählen

woerter = {}

fobj = open("woerter.txt", "r") 
for line in fobj: 
    line = line.strip() 
    zuordnung = line.split(" ") 
    woerter[zuordnung[0]] = zuordnung[1] 
fobj.close()

while True: 
    wort = raw_input("Geben Sie ein Wort ein: ") 
    if wort in woerter: 
        print "Das deutsche Wort lautet:", woerter[wort] 
    else: 
        print "Das Wort ist unbekannt"
hier die wörterliste:


Code: Alles auswählen

inter zwischen
spectare schauen
rusticus Bauer (m.)
annus Jahr (n.)
otium Ruhe (f.)
fructus Gewinn
frater Bruder (m.)
domus Haus (n.), Wohnung (f.)
visitare besuchen
caput Hauptstadt (f.), Kopf (m.)
decernere beschließen, entscheiden
ubi sobald (b. Ind. Perf., Präs. hist., Fut. II)
porta Tor (n.), Tür (f.), Pforte (f.)
advenire ankommen
uxor Ehefrau (f.)
manus Hand (f.), Arm (m.)
metus Furcht (f.), Angst (f.)
propter wegen
cura Sorge (f.), Sorgfalt (f.)
dolor Schmerz (m.)
primus der erste
trahere ziehen
nominare nennen
tantus so groß
sensus Sinn (m.)
impellere antreiben
simul zugleich
incipere anfangen
liberi Kinder
orior aufgegen
lectus bett
tres drei
post nach
novem neun
aut oder
venire kommen
octo acht
qui der
dicere erwähnen
vir Mann
quattuor vier
nullus keiner
duo zwei
vehere tragen
dies Tag
unum ein
dum während
scire wissen
sed aber, allein, dagegen, sondern
quinque	fünf
prae jüngst, vor
plus mehr
pro anStellevon
supera oberhalb, über
factum Handlung, Tat
canere singen
classis	Klasse
decem zehn
hic hier
morbus Krankheit, Erkrankung
porta Tor
canens grau
super oberhalb, über; oben
annotare anmerken, aufschreiben, aufzeichnen, notieren
proelium Kampf, Schlacht
atque und
homo Mensch
boare schreien
amare lieben
tussis Husten
regina Königin
mens Geist
Iulius Juli
nunc jetzt
persona	Person
attemptare erproben
argumentum Probe
vitulina Kalbfleisch
parvus gering, klein
lenis weich
Martius	März
tolerare dulden
nihil nichts
aevum Alter
numerus	Nummer
celebrare feiern
plenus voll
salutare grüßen, begrüßen
fructus	Frucht
quando als, wann, wenn
Asia Asien
paeninsula Halbinsel
intellegere begreifen, erfassen, verstehen
botrus Traube, Weintraube
occidaneus westlich
nonaginta neunzig
cognomen Familienname, Nachname
forum Markt, Messe
septuaginta siebzig
quia da, denn, weil
focus Herd
quinquaginta fünfzig
Graecus Grieche
cantor Berufssänger, Kantor, Sänger
magnus groß
opplere	ausfüllen, erfüllen
portus Hafen
fligere hauen, schlagen
ligare binden, verbinden
praenomen Vorname
pulvis Staub
aegrotus	krank
auricula Ohr
magirus Köchin, Koch
trochus	Reifen
aer Luft; Wolke
mori sterben
candela	Kerze, Licht
vitrum	Glas
Hispania Spanien
fluvius Fluss
ave auf Wiedersehen
rus Land
luere spülen, waschen
medius Mitte, Mittel
melior besser
arx Burg
amarulentus bitter
piscis Fisch
hospitator Gast
naris Nase
bellum Krieg
niger schwarz
arvum Acker
mensa Tisch
potui dürfen
odisse hassen
amica Freundin
mensis Monat
fumus Rauch
aspirare atmen
acta Küste
decies Million
sex sechs
porcus Schwein
studium	Studium
oblectare amüsieren
imago Ansicht, Bild
durus hart
suavis süß
hiems Winter
ad in, nach, zu; bis
sacratus heilig
pugna Kampf
mus Maus
aber immer wennich das programm starte, kommt:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python25\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Users\User\Desktop\latein programm\latein.py", line 3, in <module>
    fobj = open("woerter.txt", "r")
IOError: [Errno 2] No such file or directory: 'woerter.txt'
wie kann ich den fehler beheben? :K
Zuletzt geändert von Hyperion am Dienstag 3. April 2012, 12:55, insgesamt 1-mal geändert.
Grund: Python-Code in Python-Code-Tags gesetzt; Wortliste in Code-Tags gesetzt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also die Antwort ist ganz einfach: Deine Wörterlistedatei liegt eben nicht im selben Ordner wie Dein Script! Überprüfe mal, ob Du sie auch richtig geschrieben hast?

Ansonsten solltest Du Dateien immer mit dem `with` Statement öffnen:

Code: Alles auswählen

with open(...) as handler:
    # handler ist hier ein File Objekt und wird automatisch 
    # nach Verlassen des Blocks geschlossen
Bist Du sicher, dass Du nicht das `csv`-Modul o.ä. nutzen willst? Es gibt ja auch lateinische Vokabeln, die Leerzeichen enthalten, wie etwa "non solem... sed etiam", "altera... altera" - oder wie willst Du diese verfügbar machen? Wenn Du weitere Metainformationen wie etwa das Geschlecht oder bei Verben Stammformen o.ä. mit angeben willst, dann wirst Du die Datenstruktur noch mehr verkomplizieren müssen. Da böte sich dann das JSON-Format und damit das `json`-Modul zum Serialisieren an. Wie auch immer ist es oftmals besser, auf einen fertigen und erprobten Parser zu setzen :-)

Bei langen Code-Passagen, wie etwa Deiner Wörterliste, solltest Du diese stets in ein Paste-Bin auslagern, wie etwa paste.pocoo.org oder das im Forum eingebaute :-) Demodaten kann man übrigens auch kürzen und muss nicht 1:1 das Original hier angeben - zwei drei Einträge hätten ja als Demo vollkommen ausgereicht. Sofern der Fehler tatsächlich *in* den Daten zu suchen wäre, hätte Dir das schon jemand geschrieben bzw. nach den echten Daten gefragt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

ich habe den code jetzt so gemacht:

Code: Alles auswählen

woerter = {}

fobj = open("woerter.txt", "r") 
with open fobj as handler: 
    line = line.strip() 
    zuordnung = line.split(" ") 
    woerter[zuordnung[0]] = zuordnung[1] 
fobj.close()

while True: 
    wort = raw_input("Geben Sie ein Wort ein: ") 
    if wort in woerter: 
        print "Das deutsche Wort lautet:", woerter[wort] 
    else: 
        print "Das Wort ist unbekannt"
aber dann kommt eine fehlermeldung:

Code: Alles auswählen

Warning: 'with' will become a reserved key in python 2.6
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nein, Du hast nicht richtig hingeguckt!
An Stelle dieser Zeile

Code: Alles auswählen

fobj = open("woerter.txt", "r") 
solltest Du diese verwenden:

Code: Alles auswählen

with open("woerter.txt", "r") as handler:
    # usw.
Die Fehlermeldung macht mich ein wenig stutzig. Welche Python-Version verwendest Du? Das klingt ja nach 2.5 oder etwas noch älterem? Wenn es da keine triftigen Gründe gibt, solltest Du mal dringend auf die aktuelle 2.7er aktualisieren.

Im übrigen war der Einwand zu `with` nur eine grundsätzliche Codeverbesserung. Was hast Du denn bezüglich des Ursprungsproblems herausgefunden?

Und für eine kleine Änderung musst Du nicht wieder den kompletten Code posten btw ;-)

Als letztes: Bitte verwende doch die speziellen Code-Tags für Python-Code. Ich habe es Dir ja oben einmal "vorgemacht". [ code=python ] ohne die Leerzeichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

in der tat, ich hatte noch python 2.5, hab jetzt aber python 3.2, aber da kommt immer noch ein fehler:

Code: Alles auswählen

with open ("woerter.txt", "r") as handler
                       ^
invalid syntax
und dass obwohl ich python 3.2. habe
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Es fehlt der Doppelpunkt :roll:

Und wenn Du auf Python3 umsteigst, dann beachte die Änderungen! Du musst dann alles auf `input` umstellen, da dieses in Python3 dem `raw_input` aus Python2 entspricht. Daher hatte ich ja auch auf die aktuelle Version aus dem 2.7er Zweig hingewiesen ;-)

K.A. welches Tutorial Du benutzt, aber bei Python3 hat sich einiges geändert im Vergleich zu Python2. Und wenn Du schon an einem Doppelpunkt scheiterst, erwarte ich den nächsten Syntax Error bei `print` ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

ja, das mit dem doppelpunkt... :oops:
aber das n bei open zählt immer noch als syntax fehler :K
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann zeige mal den kompletten Code, denn der, den du gezeigt hast, ist gueltiger Python Code:

Code: Alles auswählen

>>> with open('/tmp/foo', 'w') as f:
...     pass
... 
>>> 
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

Code: Alles auswählen

woerter = {}

with open("woerter.txt", "r") as handler:
    line = line.strip() 
    zuordnung = line.split(" ") 
    woerter[zuordnung[0]] = zuordnung[1] 
fobj.close()

while True: 
    wort = raw_input("Geben Sie ein Wort ein: ") 
    if wort in woerter: 
        print "Das deutsche Wort lautet:", woerter[wort] 
    else: 
        print "Das Wort ist unbekannt"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

`fobj.close()` sollte einen `NameError` auslösen, da `fobj` ja niemals an ein Objekt gebunden wird. Ich schrieb ja oben schon, dass man das Dateiobjekt (hier heißt es jetzt bei Dir `handler` und nicht `fobj`) nicht explizit schließen muss. Neben dem reinen Fehler mit dem Namen ist das also auch noch überflüssig.

Ansonsten sehe ich aus dem Kopf keinen Fehler - wenn dann musst Du mal den kompletten Traceback von exakt diesem Code hier posten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

py32 erkennt das hier als fehler:

Code: Alles auswählen

 print "Das deutsche Wort lautet:", woerter[wort]
den fehler benennt er als syntaxfehler
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Option 1: Benutze Python 2.7.

Option 2: Benutze weiterhin Python 3.2 und arbeite entweder das Tutorial oder die What's New Seiten von Python 3.0 bis Python 3.2 durch, um zu verstehen, was sich bis zu Python 3.2 alles geaendert hat.

Das `print` sollte fuer Python 3 so heissen:

Code: Alles auswählen

print("Das deutsche Wort lautet:", woerter[wort])
Aber auch das `raw_input` solltest du aendern, darauf hatte Hyperion ja schon hingewiesen.
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

jetzt keine syntax fehler mehr, aber er erkennt das txt file nicht:

Code: Alles auswählen

with open("woerter.txt", "r") as handler:
IOError: [Errno 2] No such file or directory: 'woerter.txt'
liegt das am textfile, oder am code:

Code: Alles auswählen

with open("woerter.txt", "r") as handler:
ps:vielen dank für euer verständnis :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

12344321 hat geschrieben:jetzt keine syntax fehler mehr, aber er erkennt das txt file nicht:
s. mein erstes Posting zum Thema!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

die wörterliste ist in dem gleichen ordner und ist richtig geschrieben :K
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Startest du das Programm auch aus dem Ordner?
Das Leben ist wie ein Tennisball.
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

ja, das mache ich
BlackJack

@12344321: Das kann nicht sein, denn dann würde die Datei dort auch gefunden werden. Also entweder stimmt der Dateiname nicht, oder das Arbeitsverzeichnis des Prozesses ist nicht das in dem die Datei liegt.
12344321
User
Beiträge: 14
Registriert: Freitag 6. Januar 2012, 13:51

hier ist der ordner: http://imageshack.us/photo/my-images/823/bildig.png/

aber immer noch der gleiche fehler :(
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Lass dir doch mal den aktuellen Ordner vor dem Öffnen der Datei ausgeben (wie zum Beispiel mit ``print(os.getcwd())``).
Antworten