Textfile Zeile finden und nachfolgende 4 Zeilen anzeigen

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
Mrkrise-25
User
Beiträge: 3
Registriert: Freitag 30. Oktober 2020, 15:55

Hallo,
leider habe ich vom Programmieren/Skripten keine Ahnung und versuche mit verschiedenen Schnipseln meine Ideen zu verwirklichen.
Jetzt komme ich einfach nicht weiter. :(
Ziel ist:
Ein Raspi Zero mit Display 4X20 soll mir täglich anzeigen was am Aquarium zu tun ist.
Dafür habe ich mir bereits ein test.txt angelegt.
Inhalt (test.txt)

Code: Alles auswählen

Mo
1-Mo
Wasserwechsel 31L
Mittel 1+2
leerMo

Di
1-Di
Wasserwechsel 32L
Mittel 2+3
leerDi

Mi
1-Mi
Wasserwechsel 33L
Mittel 3+4
leerMi

Do
1-Do
Wasserwechsel 34L
Mittel 4+5
leerDo

Fr
1-Fr
Wasserwechsel 35L
Mittel 5+6
leerFr

Sa
1-Sa
Wasserwechsel 36L
Mittel 6+7
leerSa

So
1-So
Wasserwechsel 37L
Mittel 7+8
leerSo
Jetzt versuche ich mit einen Python Skript mir die jeweilen Zeilen unterhalb der Tage im Display anzeigen zu lassen.
Bis jetzt habe ich mir folgendes zusammen kopiert.

Code: Alles auswählen

from datetime import date
pfadaq = '/home/shares/aqua/test.txt'
heute = date.today()
wday = ("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So")[heute.weekday()]
def main():
    with open(pfadaq, 'r') as lines:
            next(
                (i for i, line in enumerate(lines, 1) if line.rstrip() == wday),
                0
        )


if __name__ == '__main__':
  main()

with open(pfadaq) as f:
    data = f.readlines()[7]
print(data)
Jedoch verstehe ich nicht wie dich das Ergebnis
if __name__ == '__main__':
main()
weiter verarbeiten kann.
Hoffentlich hat einer von euch etwas Zeit und Interesse und kann mir bei meinem kleinen Projekt helfen.
Vielen Dank schon mal im Voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mrkrise-25: Das Dateiformat ist schlecht und der Quelltext komplett unsinnig. Falls Du programmieren lernen möchtest, solltest Du mit einem Grundlagentutorial anfangen. Programmieren durch zusammenkopieren und raten funktioniert nicht. Man muss verstehen was man da macht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mrkrise-25
User
Beiträge: 3
Registriert: Freitag 30. Oktober 2020, 15:55

Hallo __blackjack__,
du hast vollkommen recht mit deiner Aussage, ich bin auch keiner der programmieren lernen wird.
Ich möchte mir nur ein kleines Gadget bauen, das mir die Arbeit am Aquarium etwas leichter macht und mich an meine Aufgaben erinnert.
Für meine normalen „Projekte“ finde ich fast immer fertige Lösungen, wie zum Beispiel „Home Assistent“, mit etwas guten Willen und dem Forum habe ich alles hinbekommen. (Automatisierung Gewächshaus)
Darum frage ich hier ja nach Hilfe. Wenn es euch aber keinen Spaß macht mir zu helfen, ist es auch ok.
Ich habe da leider andere Ansprüche als ihr, Ideen die ich versuche umzusetzen, halt ohne programmieren zu können.
Trotzdem wünsche ich dir und allen anderen noch ein schönes Wochenende und Danke für die ehrliche Antwort.
Liebe Grüße
MrKrise
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Mrkrise-25: Dies lösen zu wollen, ohne Programmieren zu können, läuft darauf hinaus, dass es jemand anders für Dich erledigt. Zumindest die Basics einer Sprache wie Python zu lernen, ist gar nicht so schwierig und wird Dir helfen, einfache Sachen selbst hinzubekommen. Das kann auch einem Bastler, der gar nicht tiefer einsteigen möchte, durchaus Freude bereiten. Denn am Schluß steht dann ein Erfolgserlebnis.

Mit dem folgenden Code befindet sich in 'info' der String, den Du an das Display des RasPi senden möchtest. Der Code ist natürlich ziemlich fragil, da Du das Format der '.txt' Datei nicht ändern darfst.

Vielleicht kommst Du ja damit weiter.

Code: Alles auswählen

from datetime import date

def main(fname, offset):
    start = date.today().weekday() * offset
    with open(fname, encoding='utf8') as fobj:
        lines = list(fobj)
    info = ''.join(lines[start+1:start+offset-1])
    
if __name__ == '__main__':
    main('/home/shares/aqua/test.txt', offset=6)
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Wenn es wirklich nur das ist, geht das auch ohne Python-Kenntnisse (auch wenn ich diese nahelegen würde):

Code: Alles auswählen

grep -A4 "^$(date "+%a")$" test.txt
Sa
1-Sa
Wasserwechsel 36L
Mittel 6+7
leerSa
Ggf. musst du sicherstellen, dass die verwendeten Tageskürzel denen der Locale des Linux-Systems entsprechen. Wie die Ausgabe auf deinem Display funktioniert, weiß ich nicht. Kann man das vielleicht einfach auf irgendein Device unter /dev umleiten?

EDIT:
Oder so:

Code: Alles auswählen

awk 'BEGIN{RS="\n\n"} NR==strftime("%u"){print}' test.txt
Sa
1-Sa
Wasserwechsel 36L
Mittel 6+7
leerSa
Mrkrise-25
User
Beiträge: 3
Registriert: Freitag 30. Oktober 2020, 15:55

Habt vielen Dank für eure Hilfe. ich habe bis jetzt im Garten hantiert und werde mich jetzt nochmal an den Rechner setzten um eure Hinweise umzusetzen.
Wahrscheinlich habt ihr recht. Ich werde mir jetzt mal eine online Schulung suchen und zumindest die Grundlagen von Python lernen.
Das es Spaß macht, wenn man die ersten Erfolge verzeichnen kann, denke ich mir.
Trotzdem vielen Dank für eure Hilfe und Tipps.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: `offset` klingt falsch denn der Wert ist ja kein Versatz, sondern die Blocklänge für einen einzelnen Eintrag in der Textdatei. Und `fobj` ist auch unschön. `f` ist zu kurz und Objekt ist zu nichtssagend, denn das müsste man dann ja an *jeden* Namen anhängen, denn in Python ist *alles* was man an einen Namen binden kann ein Objekt.

Das komplette Einlesen der Datei kann man sich mit `itertools.islice()` sparen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import date
from itertools import islice


def main(filename, block_length):
    start = date.today().weekday() * block_length
    with open(filename, encoding="utf8") as lines:
        info = "".join(islice(lines, start + 1, start + block_length - 1))
    print(info)


if __name__ == "__main__":
    main("/home/shares/aqua/test.txt", 6)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten