Zeichenweise aus einer Textfile lesen

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
Daniel7
User
Beiträge: 8
Registriert: Mittwoch 24. Juni 2015, 19:53

Hallo, in dem unten angeführten Programm sollen die Zeichen einer Textfile gezählt werden und aufgrund der Anzahl der Zeichen anschließend einzeln ausgegeben werden. Dies soll in einer Endlosschleife passieren.

Problem, beim ersten Mal funktioniert das Programm einwandfrei. Beim zweiten Durchlauf wird jedoch nur "Anfang" und "Ende" geschrieben.
Wenn ich die for-Schleife, in der die Zeichen gezählt werden, weglasse und die Anzahl der Zeichen selber eingeben, funktioniert das Programm auch beim zweiten und dritten Mal einwandfrei.

Danke im Vorraus

Daniel

(in der Textfile steht 1234)

AUSGABE:

Code: Alles auswählen

Anfang
1
2
3
4
Ende
Anfang
Ende
Anfang
1
2
3
4
Ende
Anfang
Ende

Code: Alles auswählen

import time

fobj_in = open("test.txt")

while 1 == 1:

    i=0
    j=0

    #Zeichen in einer Textfile zählen

    for line in fobj_in:
        for ch in line:
            j += 1

    #--------------------------------

    fobj_in.seek(0)

    print("Anfang")

    while i < j:
        Wert= fobj_in.read(1)
        print(Wert)
        i += 1

    print("Ende")

    time.sleep(1)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

um endlos über etwas zu iterieren solltest du dir mal `cycle()` aus den itertools anschauen.

Und anstatt die Zeichen pro Zeile zu zählen könntest du auch mit `len()` die Länger der Zeile bestimmen. Wenn du das Zeichen für den Zeilenumbruch nicht mit zählen willst, muss du noch an ein `strip()` für die Zeile denken.

Gruß, noisefloor
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Daniel7: dann schau Dir mal an, was beim zweiten Durchlauf anders ist.

In Python gibt es Wahrheitswerte, nutze sie, statt Dir einen ausrechnen zu lassen. Der Sinn, erst zu zählen und dann ausgeben zu lassen, erschließt sich mir überhaupt nicht. Eine Dateiobjekt weiß selbst, wann es bis zum Ende gelesen worden ist, da braucht man eigentlich nichts zu zählen:

Code: Alles auswählen

with open("test.txt") as characters:
    print("Anfang")
    while True:
        character = characters.read(1)
        if not character:
            break
        print(character)
    print("Ende")
oder, falls die Datei komplett in den Arbeitsspeicher passt:

Code: Alles auswählen

with open("test.txt") as characters:
    print("Anfang")
    for character in characters.read():
        print(character)
    print("Ende")
Daniel7
User
Beiträge: 8
Registriert: Mittwoch 24. Juni 2015, 19:53

@noisefloor, danke für diese schnelle Antwort, ich werde mich über die genannten Methoden mal informieren.
@Sirius3, ebenfalls danke für diese schnelle Antwort, diese Möglichkeit war mir noch nicht bekannt, werde sie in Zukunft anwenden.

Mit freundlichen Grüßen
Daniel
Antworten