Zahlen aus .TXT auslesen und Variablen zuweisen

  • Guten Abend,
    bin erst seit ein paar Wochen am Python programmieren aber komm nun auch mit Hilfe des Internets nicht weiter und hoffe ihr könnt mir bei meinem Problem helfen.
    Also ich habe ein Python Programm das mir nun GPS Daten(Laengengrad,Breitengrad..etc...) in eine .txt speichert, diese möchte ich nun weiterverwenden in einem anderen Python Programm.


    Auslesen kann ich dieser mit der Funktion:

    Code
    f = open('text.txt', 'r')
    for line in f:
      print(line.rstrip())

    Dann bekomme ich meine .txt datei in folgendem Format angezeigt:

    Code
    Breitengrad
    10.02020202
    Laengengrad
    9.010101011
    Hoehe
    300


    Gibt es eine Möglichkeit einzelne Zeilen auszulesen und diese dann Variablen zuzuordnen?
    Oder wie sollte ich es eurer Meinung nach am besten lösen.
    Würde mich über Beispielvorschäge freuen und bin über jede Hilfe sehr dankbar.

    Einmal editiert, zuletzt von FeDe_Q (28. August 2016 um 21:34)

  • Der oben gezeigte Code enthaelt einen Syntaxfehler - *so* laeuft das also bestimmt nicht.

    Wie man dir hilft haengt sehr davon ab, was du eigentlich mit den gelesenen Daten tun willst. Und warum du zwei Programme einsetzt. Denn wenn du einfach alles in einem machst, musst du die Daten nicht muehselig durch eine Datei uebertragen.

    Was ist also eigentlich das groessere Ziel des Ganzen?

  • Sry __deets__ hatte den falschen code gepostet..habe es nun korrigiert.

    Ich habe ein Programm das ermitelt mir aus meinem GPS Modul die benötigten Daten(Breitengrad,Längengrad..) und mit einem anderen Programm möchte ich diese Daten umwandeln in eine .KML Datei.
    Diese wollte ich mir dann automatisiert per mail zukommen lassen und dann per GoogleEarth öffnen um mir den Standort anzeigen zu lassen.

    Ich möchte die GPS Daten so zwischenspeichern und dann mit dem 2ten Programm auslesen und verwenden können.

  • Wenn du die Aufzeichnung also brachst, solltest du ein geeigneteres Dateiformat waehlen. Fuer so etwas bietet sich insbesondere CSV an. Dort ist jeder Eintrag genau eine Zeile. Es gibt das Python csv-Modul, mit vielen Beispielen, wie man eine solche Datei sowohl erzeugt, als auch einliest.

    Das Ergebnis ist dann zb das du pro Zeile in deiner Datei ein Dictionary mit Schluesseln wie zB "latitude" und "longitude" bekommst, welches du einfach weiter verarbeiten kannst.


  • Sry __deets__ hatte den falschen code gepostet..habe es nun korrigiert.

    Ich möchte die GPS Daten so zwischenspeichern und dann mit dem 2ten Programm auslesen und verwenden können.

    Sieh Dir mal die Funktion readline() an.
    Habe im Kapitel 11.4 in folgenden Buch gefunden:

    print-ISBN: 978-3-446-44133-0
    e-book-ISBN: 978-3-446-44151-4

    Bernd Klein
    Einführung in Python 3

    Das habe ich aber nicht selbst ausprobiert:
    gps = open("gps.txt").readlines()
    print(gps)

    10.02020202
    Laengengrad
    9.010101011
    Hoehe
    300

    print(gps[2])

    9.010101011

    Hope it worx, ich habe das bisher mit der bash und mapfile gelöst.

    MfG

    Jürgen

    Rechtschreibvehler stelle ich unter GPL jedem zur Verfügung.

  • Was ihr dabei vergesst ist das bei eurer Schreibweise sehr wichtige "gps.close()" , was nach jedem "open()" folgen muss, da sonst irgendwann zu viele Datei-Handler offen sind und zu Problemen nicht nur fürs Script sondern fürs gesamte System führt. Das einfachste ist eine Schreibweise mit "with" zu verwenden denn das kümmert sich anschließend selbstständig ums schließen.

    [code=php]
    with open('gps.txt', 'r') as fp:
    print(fp.readlines())
    #selbststaendiges schließen des fp da der Block verlassen wird
    [/php]
    bzw
    [code=php]
    with open('gps.txt', 'r') as fp:
    werte = fp.readlines()

    print(werte[2].rstrip())
    print(werte[1].rstrip())
    [/php]
    oder
    [code=php]
    werte=[]
    with open('gps.txt', 'r') as fp:
    for line in fp.readlines():
    werte.append(line.rstrip())

    print(werte[2])
    print(werte[1])
    [/php]

    Nichts desto trotz verursacht das schreiben der aktuellen Werte in eine simple Textdatei eigentlich eine unnötige Belastung für die SD Karte wodurch dessen Haltbarkeit unnötig verkürzt wird. Es wäre daher denk ich sinnvoller entweder beide Scripts zu einem zu vereinen und die GPS Werte direkt an eine weiterverarbeitende Funktion zu übergeben, oder eine Übergabe der Werte mithilfe von zum Beispiel Socket...


    PS: Das print ist für/von Python3

  • Guter Hinweis bezüglich des with Statements.

    Allerdings glaube ich tatsächlich das der TE mit der Teilung in zwei Programme gut fährt. Grund ist KML. Als XML derivat ist das notorisch empfindlich wenn es um das abbrechen eines Programmes geht. Weil es der schließenden Tags bedarf - die dann fehlen.

    Ein Aufzeichnungs und ein Konvertierungsschritt sind deshalb ganz passend denke ich.


    Gesendet von iPhone mit Tapatalk

  • Dann würde ich trotzdem die gps.txt in ein tmpfs ablegen damit die SD nicht unnötig belastet wird - oder die Übergabe der Werte ans andere Script mithilfe von FIFO oder Socket umsetzen ;)

    Zum Beispiel tmpfs für /tmp/ aktivieren, geht in der Datei /etc/default/tmpfs und dort dann RAMTMP=yes setzen sowie rebooten. Dann den Pfad beim schreiben und lesen natürlich entsprechend anpassen: /tmp/gps.txt

    Mit FIFO könnte das wie folgt aussehen:

    Code
    mkfifo /tmp/gps


    Dann das Script was dein GPS Device ausließt in diese Datei schreiben, und das andere Script wiederum die Datei auslesen lassen...
    Beispiel:

    PHP
    while True:
        with open("/tmp/gps") as fp:
            for line in fp.readlines():
                print(line.rstrip())
    [/php]
    Und auf einer weiteren Konsole führst du dann zum testen das aus:
    [code]
    echo -e "10.02020202\n9.010101011\n300" > /tmp/gps


    Der Python Code sollte dann eine sofortige Ausgabe erzeugen.

    Und bezüglich Socket siehe hier: Nachricht über Netzwerk senden

  • Das aendert doch das Problem nicht. Wenn du Socket/Fifo-Kommunikation verwendest, kannst du genauso gut alles in einem Prozess machen. Wenn man das ganze in eine RAM-Disk macht, braucht man ebenfalls keine Datei/IPC-Loesung. Denn der Vorteil der Entkopplung ist ja gerade, dass man auch mal ein ausschalten ueberlebt. Zumindest wahrscheinlich, wenn die SD-Karte/das FS nicht den Geist aufgibt.

    Ohne diesen Entwurfsentscheidung gibt es keinen Grund fuer diese erhoete Komplexitaet.

  • bootsmann sowohl json als auch XML erwarten einen Abschluss der Daten in Form von schliessenden Tags/Klammern, und erlauben nicht mehrere "Dokumente" in einer Datei. Damit machen die das Leben unnoetig schwierig. Wenn du jeweils snippets von JSON/XML speicherst, musst du einen Trenner einbauen und daran entlang parsen. Geht natuerlich, ist aber gegenueber CSV aufwaendiger. Und der TE waere damit wahrscheinlich noch eher ueberfordert.

  • Er generiert alle n Sekunden einen GPS Eintrag. Wenn du den mit xml oder Json speicherst, *musst* du für ein gültiges Dokument das Root Tag bzw die umschließende Liste abschließen.

    Damit sind diese Formate eher ungeeignet. Denn zB dom basierte oder die eingebaute json Libs können nicht streambasiert arbeiten, und du musst Maßnahmen ergreifen um bei Programmabbruch den Epilog raus zu schreiben.

    Wenn man aber CSv benutz, ist jeder Eintrag eine Zeile. Selbst wenn die letzten paar davon durch einen Stromausfall vermüllt sind, ist bis dahin alles gültig. Json oder xml musst du dann aber erstmal reparieren.

    Anders gesagt: das ist ein logfile, und eine Postprocessing dessen. Xml und json sind keine logfile Formate.


    Gesendet von iPhone mit Tapatalk

  • ElementTree fügt ein Element vor einem end-Tag ein. JSON wird jedes mal neu generiert, da haust du Recht. Bei ElementTree behaupte ich jetzt einfach mal so, dass dies nicht der Fall ist. Wissen tu ich es nicht 100%ig.

    Wie auch immer finde ich es so wie es vom TE gemacht wird (Zeile für Zeile, neu oder angehängt) unpraktikabel. Es gibt noch viele andere Möglichkeiten für eine Persistenz (shelve, pickle etc)

  • Natuerlich tut ElementTree das. Das Problem mit json, xml und auch pickle ist aber, dass sie immer das *komplette* Dokument speichern muessen. Sonst geht's nicht. Das ist anders bei CSV.

Jetzt mitmachen!

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