@aqualx: Die Klammern um die Bedingungen gehören da nicht hin und man schreibt der lesbarkeit halber auch einzelne Zeilen in einem Block in eine eigene Zeile. `readline()` ist ineffizient, man iteriert direkt über die Zeilen des Dateiobjekts. Das man bitte nicht `f` nennt sondern `file` oder `lines`. Wenn man zusätzlich zu den Elementen eines iterierbaren Objekts noch eine laufende Zahl braucht, dann gibt es dafür die `enumerate()`-Funktion. Aber wozu brauchst Du überhaupt die Zahl?
Das `stop`-Flag ist überflüssig wenn man eine Endlosschleife schreibt, die an der entsprechenden Stelle mit `break` verlassen wird.
``line[0]`` kann einem auf die Füsse fallen wenn `line` eine leere Zeichenkette ist. Kann hier nicht passieren, aber mit das Problem kann man mit der `startswith()`-Methode umgehen. Was dann auch die Frage nach der Suche nach "***" beantworten sollte.
Was bekommst Du denn statt 34 für einen `i`-Wert? Und hast Du Dir `i` und ``line[0]`` denn einfach mal *in* der Schleife ausgeben lassen‽ Was erwartest Du da und in wie weit weichen die Ausgaben von Deinen Erwartungen ab?
Edit: Achtung, fehlerhaft:
Code: Alles auswählen
from zipfile import ZipFile
def main():
with ZipFile("testdatei.zip") as archive:
with archive.open("folder/file.dat") as lines:
i = None
for i, line in enumerate(lines):
if line.startswith("*"):
break
print(i)
if __name__ == "__main__":
main()
Hier wird dann eine Ausnahme ausgelöst die den Fehler in Deinem Programm zeigt. Basically:
Also entweder auf `bytes`-Ebene arbeiten, oder das `io`-Modul zur Hilfe nehmen.