[Gelöst] Python3 Zeilen von unten bis Zeichen zählen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • [Gelöst] Python3 Zeilen von unten bis Zeichen zählen? Schau mal ob du hier fündig wirst!

  • Zur hilfreichsten Antwort springen
  • Unter der Voraussetzung, dass es mindestens ein "#" gibt und die Zeilen mit Zeilenenden abgeschlossen sind, wäre eine kurze Lösung:

    Python
        with open("test.txt", encoding="utf-8") as file:
            lines = list(file)
        print(len(lines) - lines.rindex("#\n"))

    Falls es keine "#"-Zeile gibt, löst das einen `IndexError` aus.

    Alternativ, falls man etwas mehr Code schreiben will, aber weniger Speicher verbrauchen möchte, weil man ja nicht alle Zeilen auf einmal im Speicher dafür braucht:

    Python
        with open("test.txt", encoding="utf-8") as lines:
            line_count = None
            for line in lines:
                if line.rstrip() == "#":
                    line_count = 0
                if line_count is not None:
                    line_count += 1
    
            print(line_count)

    Das gibt, falls gar kein "#"-Zeile enthalten ist, den Wert `None` aus.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Falls es okay ist, das man den Fall das *keine* "#"-Zeile vorkommt, nicht davon unterscheiden kann, dass dies die *letzte* Zeile ist, und das es nur eine "#"-Zeile geben darf, ginge wohl auch das hier:

    Python
    from itertools import dropwhile
    
    
    with open("test.txt", encoding="utf-8") as lines:
        print(sum(1 for _ in dropwhile(lambda line: line.rstrip() != "#", lines)))

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Btw. Vielleicht wäre mein Vorgehen etwas unkonventionell um das Ziel zu erreichen. Ich würde die Datei auch zeilenweise in eine Liste packen und dann die Liste invertieren / umkekren mit reversed(List). Dann diese Liste per Schleife nach '#' duchsuchen und wenn im Item kein Treffer war, einen Counter hochzählen lassen. Wenn '#' gefunden wird, dann die Schleife verlassen. :conf:

    Es geht hier ja nur um die Anzahl der Zeilen, die nach einem bestimmten letzten Zeichen in einer Datei kommen.

  • Dann musst Du wohl etwas konkreter werden müssen. :conf: Dein Beispiel oben aus #3 hatte ich zwischenzeitlich mal mit den anderen Skripten aus #4 und #5 (dem ersten ausgenommen) getestet und das funktioniert bei mir.


    Hier mal die groben Tests:

    Hatte da halt die drei ' einfach nur hin und her geschoben.

    Die Ausgabe hier ist

    Code
    pi@avi:~ $ /home/pi/skripte/test_text.py
    7
    7

    - Der Weg zur Erkenntnis: Wie frage ich nach Hilfe? | Zur Erinnerung: Forenregeln | Quatsch und Tratsch: Plauderecke -

    Einmal editiert, zuletzt von hyle (2. März 2023 um 23:22) aus folgendem Grund: Ein Beitrag von hyle mit diesem Beitrag zusammengefügt.

  • Also, nochmal langsam:

    Ausgabe:

    Code
    None
    0
    18
    Traceback (most recent call last):
      File "/home/pi/./zaehle_zeilen.py", line 26, in <module>
        print(len(lines3) )- lines3.rindex("#\n")
    AttributeError: 'list' object has no attribute 'rindex'

    Inhalt liste.txt:

  • fred0815 Du musst schon auch die drei Skripte trennen und vor allem das erste nichtfunktionierende "kommentieren". D.h. in drei ' davor und dahinter setzen. Kommentieren trifft es in dem Fall zwar nicht, aber das hat erstmal den selben Effekt und wird vom Interpreter nicht beachtet.

    Code
    '''
    with open("/home/pi/skripte/test.txt", encoding="utf-8") as file:
        lines = list(file)
    print(len(lines) )- lines.rindex("#\n")
    '''

    Btw. Deine Fehlermeldung passt irgendwie nicht zu dem gezeigten Skript.

    Versuchs einfach mal mit

  • Ich hätte gerne gewusst, wieviele Zeilen es zwischen dem Zeichen '#' (in der Datei) und dem Dateiende gibt.

    Noch eine Frage dazu (hoffe ich hab es nicht überlesen), kommt die Zeile mit # nur einmalig vor? und wie in #14 kommt ja nicht # vor sondern ganz viele #####... - also wie kommt das # vor? einzeln oder in vielfacher Ausführung?

    • Hilfreichste Antwort

    Sorry für den Doppelpost,

    aber hier mal mein Ansatz ( ja auf Deutsch ;) )

    Hier reicht das Vorkommen von #. Egal ob da noch anderweitiger Text enthalten ist. Wenn das nicht gewünscht ist müsst das natürlich noch angepasst werden bei der Abfrage in Zeile 11

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!