Anfängerfrage: readlines()

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 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?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Indem du mit `.seek(0)` den Lesecursor wieder zum Anfang der Datei setzt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oder du liest die Zeilen einmal aus und speicherst sie in einer Liste.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

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

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?
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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

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?
Zuletzt geändert von bjoernh am Samstag 29. Mai 2010, 17:53, insgesamt 1-mal geändert.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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):
the more they change the more they stay the same
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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

Meinst du das hier mit Dokumentation?
http://docs.python.org/library/string.html#string.strip
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kommt hier zwar so ziemlich auf's selbe raus, aber es gibt auch str.strip in der Doku.
Antworten