Beispielsätze aus Vokabellisten (Anfängerfrage)

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
bjoernh
User
Beiträge: 20
Registriert: Donnerstag 27. Mai 2010, 15:45

Hallo zusammen,
Ich hab gerade mein erstes Projekt geschrieben. Ich hoffe jemand weiß, was los ist.

Ich hab 3 .txt files:

nvutf8.txt Neue (zu lernende) Vokabeln sind hier
esutf8.txt Beispielsätze sind hier
exoututf8.txt Beispielsätze aus esutf8.txt sollen hierein, sofern sie Vokabeln aus nvutf9.txt enthalten.

Ich hab den folgenden Code geschrieben.

Code: Alles auswählen

import codecs

enout = codecs.open('Python/ExListBuild/exoututf8.txt', encoding = 'utf-8', mode = 'w')

nvin = codecs.open('Python/ExListBuild/nvutf8.txt', encoding = 'utf-8', mode = 'r')

for line in open('Python/ExListBuild/nvutf8.txt'):
	newvocab = nvin.readline()
	print "-"
	print "next vocab item being checked"
	print "-"
	esin = codecs.open('Python/ExListBuild/esutf8.txt', encoding = 'utf-8', mode = 'r')
	for line in open('Python/ExListBuild/esutf8.txt'):
		sentence = esin.readline()
		index = sentence.find(newvocab)
		if index==-1:
			print "nope"
		else:
			print "yes"
			enout.write(sentence)
	esin.close()
nvin.close()
Ich benutze folgdenden Beispielsätze in esutf8.txt:
我前边要拐弯了,请注意。
车来了快跑。
请排好队上车。
带好自己的东西。
方向错了!
我给你讲一个成语故事。
感谢你对我们的关心。

Neue Vokabeln in nvutf8.txt:



Raus kommt in exoututf8.txt
我前边要拐弯了,请注意。
我给你讲一个成语故事。
感谢你对我们的关心。

Es klappt also für 我, aber nicht für 要 (welches im ersten Satz vorkommt).
Testen hat ergeben, dass NUR der letzte Eintrag aus nvutf8.txt korrekt behandelt wird, aber alle anderen nicht.
Hab ich bei dem Unicode-Kram Mist gebaut?
BlackJack

@bjoernh: Überleg Dir mal worüber die ``for``-Schleifen eigentlich laufen sollen und worüber sie bei Dir tatsächlich laufen. Du hast zwei Dateien zum lesen, also sollten in dem Programm auch nur zweimal Anweisungen zum öffnen einer Datei zum Lesen vorkommen und nicht viermal.

Die Laufzeit ist suboptimal. Du solltest jede der Dateien nur einmal öffnen und einlesen. Und eigentlich müsste bei den eingelesenen Zeilen auch noch das Zeilenende enthalten sein, also dürfte im Grunde so gar keine Ausgabe erscheinen solange nicht eine der neuen Vokalbeln am Ende eines Beispielsatzes steht!?

Die Namensgebung könnte besser sein. Was ist soll `esin` bedeuten? "Erweiterter Sinus"? So etwas wie `examples_file` wäre deutlich aussagekräftiger.
bjoernh
User
Beiträge: 20
Registriert: Donnerstag 27. Mai 2010, 15:45

Hmm... Danke erstmal für die Antwort. Wie unschwer zu erkennen, bin ich kein Programmierer sondern ein Sprachenlerner mit oberflächlichem Interesse am Programmieren.

Zu deinen Vorschlägen:
-die for-Schleifen scheinen mir das Richtige zu machen: Nehme die erste neue Vokabel, durchsuch alle Beispielsätze nach ihr, nehme die nächste neue Vokabel, durchsuch wieder alle Beispielsätze, usw.
-So besser um häufiges Öffnen zu umgehen?

Code: Alles auswählen

nvnumberoflines = len(nvin.readlines())
for line in range(0,nvnl):
ich öffne esutf8.txt sogar noch öfter :(
-esin = Example Sentence in, ... , geht besser.
BlackJack

@bjoernh: Mit der Anzahl meinte ich erst einmal nur die statischen vorkommen von Anweisungen zum öffnen der Datei(en) und nicht wie oft die zur Laufzeit ausgeführt werden. Der Unsinn den Du da machst ist in der ``for``-Schleife die Dateien mit völlig unnötigerweise mit `open()` zu öffnen, darüber zu iterieren, aber überhaupt nichts mit *diesen* Zeilen anzufangen. Du solltest über die Dateiobjekte iterieren die Du mit `codecs.open()` geöffnet hast. Und zwar *direkt* -- ohne irgendwelche unbenutzten "Stellvertreter" oder komplettes Einlesen und Indices.

Was Deine Schleifen da ja machen ist: Lies eine Zeile aus der Vokabeldatei (``for``-Schleife), lies die gleiche Zeile über ein anderes Datei-Objekt (`nvin`) und das gleiche in der inneren Schleife nochmal mit der Datei mit den Beispielsätzen. Das Objekt `line` wird nie benutzt.
bjoernh
User
Beiträge: 20
Registriert: Donnerstag 27. Mai 2010, 15:45

Ich hab das andere thread upgedated.
http://www.python-forum.de/viewtopic.php?f=1&t=23005
Ist der Code so ok? Wie kann ich das Problem mit den Zeilenendenzeichen lösen?
Antworten