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:

Code: Alles auswählen

for line in file_obj:
    print line
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:

Code: Alles auswählen

help(str.strip)
Grüße
Gerrit

Re: Anfängerfrage: readlines()

Verfasst: Samstag 29. Mai 2010, 18:40
von bjoernh
Meinst du das hier mit Dokumentation?
http://docs.python.org/library/string.html#string.strip

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.