Seite 1 von 1
Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 17:50
von bjoernh
Hallo nochmal, heute ist mein 2ter Python-Tag also bitte freundlich sein

Ich hab ein mini-programm geschrieben:
Code: Alles auswählen
import codecs
examples_file = codecs.open('Python/ExListBuild/esutf8.txt', encoding = 'utf-8', mode = 'r')
for i in range(0, 4):
print "iteration", i
for line_es in examples_file.readlines():
print "hallo"
Dies liefert eine Ausgabe von
iteration 0
hallo
hallo
iteration 1
iteration 2
iteration 3
Wie kann ich das line_es Element wieder zurücksetzen, so daß
iteration 0
hallo
hallo
iteration 1
hallo
hallo
iteration 2
hallo
hallo
iteration 3
hallo
hallo
passiert?
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 17:58
von snafu
Indem du mit `.seek(0)` den Lesecursor wieder zum Anfang der Datei setzt.
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 18:00
von EyDu
Oder du liest die Zeilen einmal aus und speicherst sie in einer Liste.
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 18:07
von snafu
Oder noch besser: Du sagt uns, was dein eigentliches Ziel ist. Die Frage an sich, macht in meinen Augen erstmal nicht viel Sinn vom Nutzen her.
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 18:13
von bjoernh
Zum Chinesisch lernen möchte ich Beispielsätze aus neuen Vokabeln generieren:
http://www.python-forum.de/viewtopic.php?f=1&t=23003
In dieses thread wollte ich dann ein Problem isolieren.
Bin sicher, daß ich noch in so einige Fettnäpfchen treten werde.
So wie unten beschrieben klappt es leider auch noch nicht.
Code: Alles auswählen
import codecs
create_examples_file_out = codecs.open('Python/ExListBuild/exoututf8.txt', encoding = 'utf-8', mode = 'w')
newvocab_file = codecs.open('Python/ExListBuild/nvutf8.txt', encoding = 'utf-8', mode = 'r')
examplesentences_file = codecs.open('Python/ExListBuild/esutf8.txt', encoding = 'utf-8', mode = 'r')
for line_nv in newvocab_file.readlines():
#print repr(line_nv)
print "-"
print "next vocab item being checked"
print "-"
for line_es in examplesentences_file.readlines():
print repr(line_es)
index = line_es.find(line_nv)
if index==-1:
print "nope"
else:
print "yes"
create_examples_file_out.write(line_es)
examplesentences_file.seek(0)
newvocab_file.close()
examplesentences_file.close()
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 18:27
von BlackJack
@bjoernh: Sind denn nun Zeilenende-Zeichen an den einzelnen Zeilen noch dran oder nicht? Ich bin ja immer noch der Meinung hier dürfte kein Treffer gefunden werden solange die Vokabel nicht am Ende eines Beispielsatzes steht.
Re: Anfängerfrage: readlines()
Verfasst: Donnerstag 27. Mai 2010, 19:26
von bjoernh
BlackJack hat geschrieben:@bjoernh: Sind denn nun Zeilenende-Zeichen an den einzelnen Zeilen noch dran oder nicht? Ich bin ja immer noch der Meinung hier dürfte kein Treffer gefunden werden solange die Vokabel nicht am Ende eines Beispielsatzes steht.
Nein sind sie nicht. Jetzt findet er auch gar nichts mehr. Kann man dies schnell korrigieren?
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 11:33
von DaMutz
Code: Alles auswählen
for line_nv in newvocab_file.readlines():
line_nv = line_nv.strip()
print "-"
print "next vocab item being checked"
print "-"
for line_es in examplesentences_file.readlines():
print repr(line_es)
index = line_es.find(line_nv)
if index==-1:
print "nope"
else:
print "yes"
create_examples_file_out.write(line_es)
examplesentences_file.seek(0)
newvocab_file.close()
aber das ganze konstrukt ist nicht wirklich elegant.
Lies doch alle keywords (Wörter die du lernen möchtest) in eine Liste. Dann öffnest du die Datei mit den Beispielsätzen und schaust ob irgend ein keyword in der Zeile vorkommt und speicherst diese Zeile in deiner Ausgabedatei. In etwa so würde ich es machen. Wahrscheinlich gibt es noch bessere Ideen.
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 11:55
von gkuhl
Wozu überhaupt immer "readlines()". Man kann über Dateien auch direkt iterieren:
Grüße
Gerrit
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 12:21
von BlackJack
Rein von den zu erwartenden Datenmengen ist es wahrscheinlich auch ungünstig die Beispielsätze immer wieder neu einzulesen. Ich gehe mal davon aus, dass die Menge der neuen Vokabeln kleiner sein wird. Und ausserdem in den Speicher passt. Dann braucht man keine Datei immer wieder und wieder lesen, sondern kann sich die Vokabeln *einmal* am Anfang in eine Liste einlesen. Ungetestet:
Code: Alles auswählen
def main():
with codecs.open('neue_vokabeln.txt', 'r', 'utf-8') as lines:
new_words = [s.strip() for s in lines]
with codecs.open('ausgabe.txt', 'w', 'utf-8', 'w') as out_file:
with codecs.open('beispiele.txt', 'r', 'utf-8') as example_sentences:
for example_sentence in example_sentences:
for new_word in new_words:
if new_word in example_sentence:
print 'yes'
out_file.write(example_sentence)
break
else:
print 'nope'
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 17:21
von bjoernh
Danke für den input. Ich hab inzwischen eine funktionierende Version. Geplant ist eine große Menge von Beispielsätzen zu verwenden, daher werde ich versuchen, den Kram aber noch günstiger zu machen. Insbesondere die
with ... as Konstruktion sieht interessant aus.
Anfängerfrage: Was macht .strip(), also ohne Argument?
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 17:24
von Dav1d
aus der contextlib gibt es auch noch `nested`
Code: Alles auswählen
with nested(codecs.open('ausgabe.txt', 'w', 'utf-8', 'w'), codecs.open('beispiele.txt', 'r', 'utf-8')) as (out_file, example_sentences):
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 18:33
von gkuhl
bjoernh hat geschrieben:Anfängerfrage: Was macht .strip(), also ohne Argument?
Steht doch in der Dokumentation, oder auch bei:
Grüße
Gerrit
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 18:40
von bjoernh
Re: Anfängerfrage: readlines()
Verfasst: Samstag 29. Mai 2010, 18:46
von snafu
Kommt hier zwar so ziemlich auf's selbe raus, aber es gibt auch
str.strip in der Doku.