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

  • Ich komme schon wieder nicht weiter, dabei möchte ich nur eine Datei öffnen und mir die Zeilen ausgeben lassen, die es von der Zeile ganz unten bis zu dem Zeichen "#" weiter oben hat.

    Ich habe jetzt schon mit splitline(), count(), find(), readlines() probiert, es klappt nicht. :wallbash:

    :helpnew:

  • Go to Best Answer
  • fred0815 So ganz ist mir nicht klar was Du willst, aber wäre `rpartition()` auf den gesamten Dateiinhalt eventuell das was Du suchst?


    Ungetestet:

    Python
    from pathlib import Path
    
    print(Path("pfad/der/datei.txt").read_text("utf-8").rpartition("#")[2])

    “There are two ways to write error-free programs; only the third one works.” — Alan J. Perlis

  • 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.

    “There are two ways to write error-free programs; only the third one works.” — Alan J. Perlis

  • 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)))

    “There are two ways to write error-free programs; only the third one works.” — Alan J. Perlis

  • 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
  • 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?

    • Best Answer

    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

  • fred0815

    Changed the title of the thread from “Python3 Zeilen von unten bis Zeichen ermitteln” to “[Gelöst] Python3 Zeilen von unten bis Zeichen zählen”.