Daten aus Dateien einlesen und als Variablen verwenden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Leute,

    ich bin neu in der Raspberry Welt und seit gestern stolzer Besitzer einen Rasp Pi 3. Habe ein Projekt was ich programmieren will, und mache gerade die ersten Schritte in Python 2/3.

    Nun stehe ich irgendwie auf dem Schlauch und komme nicht weiter.

    Ich habe Dateien in denen Daten gespeichert sind, auf die ich zugreifen möchte.

    Beispiel eine Setup Datei in der, durch Komma getrennt, Werte stehen. Vereinfacht gesagt möchte ich das was in Listen geht, also

    Setup = ["Wert1","Wert2","Wert3"]

    und was man so schön als

    Print (Setup[1])

    >>>Wert2

    ausgeben kann, aus einer Datei einlesen.

    Nun habe ich folgende Syntax:

    Datei_Setup = open("/home/pi/Setup.csv", 'r')
    for line in Datei_Setup:
    Setup = line.rstrip()
    Datei_Setup.closed

    print (Setup[1])

    Da gibt er mir aber das zweite Zeichen, also nach meine Beispiel "W" anstatt "Wert1" aus. Klar Python erkennt den Wert als String und nicht als Liste.

    Nun die eigentliche Frage:

    Wie kann ich den eingelesenen String in eine Liste (Sequenzieller Datentyp) Verwandeln?

    Habe mir schon die Finger wund gegoogelt, es schon mit

    Setup = [line.rstrip()]
    und
    Setup = [Str(line.rstrip())]

    versucht, bin aber gescheitert.

    Ich habe Dateien die nur einen Datensatz enthalten, also eine Zeile mit mehreren Werten und auch Dateien die mehrere Datensätze enthalten, also mehrere Werte in mehreren Zeilen.

    Vielleicht gibt es auch Alternativen? (Datenbanken, andere Funktionen oder Herangehensweise)

    Was ist der Beste Weg für sowas?

    Bin für Anregungen offen.

    Vielen Dank im Voraus

    Ralf

    P.S.
    Wenn mein Projekt erfolgreich ist, werde ich es natürlich hier veröffentlichen

    Einmal editiert, zuletzt von nonickatall (9. November 2016 um 12:04)

  • Daten aus Dateien einlesen und als Variablen verwenden? Schau mal ob du hier fündig wirst!

  • Der Code da oben ist ganz bestimmt nicht das, was du tust - es gibt keine "closed", und "close", welches es gibt, muss man auch aufrufen - also "datei.close()".

    Damit man dir helfen kann, musst du

    - deinen tatsächlichen Code posten.
    - den wirklichen Inhalt der Dateien, die du einlesen willst.
    - potentielle Fehlermeldungen mit ihrem gesamten Stacktrace.

    Bitte benutze auch die code-tags, weil Python sonst hier im Forum verhackstückt wird. Dazu schreibst du

    [code*]
    dein_code()
    [/code*]

    und lässt die Sternchen weg (komplett. Auch kein Leerzeichen).

    • Offizieller Beitrag

    Wenn die wirklich in diesem Listen format in den dateien sind, wäre das eine Möglichkeit:

    Code
    list =[]
    with open("C:\\python27\\test.txt") as f:
        for line in f:
            if line != "":
                for x in line.split("=")[1].split("[")[1].split("]")[0].split(","):
                    list.append(x.strip())
    print list

    Ich würde mir allerdings ein anderes Speicherformat ausdenken und zum Beispiel Pickle nehmen. Denn das macht genau das was du willst. Für python gilt fast das gleiche wie für Apple "There's a(n) module(app) for that"

  • dbv: ich bezweifele sehr, dass er seine Daten so vorliegen hat. *Wenn* wuerde sich das Python-Modul ast mit seiner Funktion literal_eval anbieten.

  • Hallo,

    nonickatall: falls du eine Möglichkeit hast, die Datenstruktur in der Setup Datei zu beeinflussen, dann hast du drei bessere Möglichkeiten:

    * schreib' die Setup Datei im Python-Syntax und importiere, was du brauchst
    * schreib' die Setup Datei im INI-Stil und lese diese mit dem Modul `configparser` ein
    * schreib' die Setup Datei in JSON und lese diese mit dem `json` Modul ein

    Gruß, noisefloor

  • noisefloor: Möglichkeit 1 ist nahezu nie besser, da sie automatisch beliebigen Code ausführt. literal_eval, wie schon erwähnt, wuerde dem Abhilfe schaffen. Warum INI besser sein soll als CSV erschliesst sich mir auch nicht. Gegen JSON ist natürlich nix einzuwenden, ist aber letztlich sehr synonym zu 1, und die hat den Vorteil das trailing Kommas und Kommentare erlaubt sind.

  • Hallo an alle und erst mal Danke für die Ansätze die ich weiter verfolgen kann.

    @deets

    Danke für den Hinweis mit dem Code:

    Das ist der Code mit dem ich momentan teste:

    Code
    Datei_Setup = open("/home/pi/Setup.csv", 'r')
    for line in Datei_Setup:
      Setup = line.rstrip()
    Datei_Setup.closed
    
    
    
    
    #Setup = ["+49177-2500***","0"]
    print (Setup[0])

    Ergebnis ist:

    >>> ================================ RESTART ================================
    >>>
    "
    >>>

    Eine Fehlermeldung kommt da nicht.. Und wenn ich das obere Setup mit # versehe und das unter aktiv schalte kommt:

    >>> ================================ RESTART ================================
    >>>
    +49177-2500***
    >>>

    So wie es soll…

    Meine Setup Datei enthält übriges:

    "+49177-2500***","0"

    Mehr erst mal nicht, ist ja nur zum Testen. Mir geht es darum, dass ich feste oder einstellbare Parameter des Programms, wie meine Rufnummer an die SMS mit Fehler und Statusmeldungen geschickt werden sollen, und andere Parameter in einer csv. Ini, txt, oder meinetwegen auch Datenbank habe, damit ich bei Änderungen nicht an den Code muss. Ist auch für andere einfacher, wenn Sie sich später mal das Projekt kopieren.

    Was will ich überhaupt machen?

    Ich will eine Tor-Steuerung programmieren wo Mieter, die ich in einer zweiten Datei eintrage Berechtigungen bekommen, das Tor zu öffnen oder nur zu bestimmten Zeiten oder what ever.

    Ich will im nächsten Schritt das Ganze so aufsetzen, dass ich eine SMS an das Programm schicken kann, die mir dann neue Mieter einträgt oder löscht, das Tor sperrt oder ganz offen lässt.

    Die Struktur steht also noch nicht ganz fest, weil mir erfahrungsgemäß beim programmieren, ich programmiere relativ viel in VBA, noch Ideen kommen. ;)

    Die Struktur der Daten wird ausschließlich durch mich bestimmt. Deswegen nur her mit den Ideen. Ich dachte halt, da es max. 30 Mieter und nur eine Setupzeile gibt, wäre eine Textdatei, die ich bei Programmstart lade und die Daten im Speicher halte, schlank und effizient.

    Aber wenn es bessere Methoden unter Python gibt bin ich offen für alles..

    Liebe Grüße
    Ralf

    Einmal editiert, zuletzt von nonickatall (9. November 2016 um 19:31)

  • Zeig doch mal den kompletten Inhalt deiner ominösen Datei - erst dann kann man dir auch sagen Wie du diese am besten verarbeiten kannst


    PS: FAQ => Nützliche Links / Linksammlung => SMS


  • Automatisch zusammengefügt:
    .
    .
    und wenn das Zeilenende weg soll:

    Code
    Datei_Setup = open("test.csv", 'r')
    for line in Datei_Setup:
       line = line.rstrip("\n")
       Setup = line.split(",")
       print(Setup)
    Datei_Setup.closed
    
    
    #Setup = ["+49177-2500***","0"]
    print (Setup[0])
  • Wenn in seiner Datei das drin steht:

    Code
    "+49177-2500***","0"


    würde print(Setup[0]) das ausgeben:

    Code
    "+49177-2500***"

    es fehlt also noch was ;)

    Wenn das wirklich das einzige ist was in der Datei steht und er mit der Telefonnummer weiter arbeiten will, würde ich ehr das vorschlagen:


    Und die Zeilen die du/ihr/ich gezeigt haben bewirken dann:

    Code
    >>> Datei_Setup = open("test.csv", 'r')
    >>> for line in Datei_Setup:
    ...    Setup = line.split(",")
    ... 
    Datei_Setup.close()
    >>> print(Setup[0])                           
    "+49154-98756*"
    >>> print(Setup[1])
    "0"

    ...deshalb auch meine Frage nach dem genauen Inhalt der Datei ;)

    Mein Vorschlag, sofern in der Datei mehrere Zeilen stehen, wäre:

  • Hallo,

    vielen Dank für Eure Mühen, komme erst heute Nachmittag dazu mal einiges auszuprobieren.

    Aber nochmal zur Klarstellung:

    Mir geht es um das grundsätzlich Verfahren bzw. die Möglichkeite im Programmablauf auf Werte aus Dateien zuzugreifen. Dabei habe ich im Prinzip zwei Fälle.

    Fall 1: Eine Datei mit nur einer Zeile aber mehreren Feldern. Beispiel:

    Wert1,Wert2,Wert3

    Ob nun in Anführungszeichen als String, getrennt mit Komma Semikolon oder wie auch immer ist erst mal wurscht.
    Da möchte ich natürlich gezielt Feld 1,2 oder 3 ansprechen. Ansprechen heißt natürlich: Ich lese die Daten ein und schreibe sie in Variablen. Im Programmablauf arbeite ich dann mit den Variablen.

    Fall 2: Ein Datei mit mehreren Datensätzen. Beispiel:

    Feld1,Feld2,Feld3
    WertA1,WertA2,WertA3
    WertB1,WertB2,WertB3
    WertC1,WertC2,WertC3

    Ob nun in Anführungszeichen als String, getrennt mit Komma Semikolon, mit Feld Bezeichnern oder wie auch immer ist mir auch hier erst mal wurscht.

    Natürlich würde ich keine Daten aus einer Textdatei holen, wenn da 12.000 Datensätze drin stehen und ich auch noch ständig suchen muss. Aber wie gesagt in meiner Datei stehen max. 30 Datensätze.

    Es gibt dazu momentan noch keine konkrete Datenstruktur.

    Mir geht es aber auch mehr um das grundsätzliche wie. Die konkrete Ausgestaltung bastel ich mir dann.

    LG
    Ralf

    Einmal editiert, zuletzt von nonickatall (10. November 2016 um 10:06)

    • Offizieller Beitrag

    Es gibt kein Grundsätzliches wie. Denn alles hängt von der vorliegenden Struktur ab. Datei öffnen, Struktur erkennen, ggf. vorhandenes Modul nutzen (z.B. bei csv) oder notfalls sich selber was basteln. Generell sollte man sich beim speichern solcher Dateien schon Gedanken gemacht haben wie man sie ggf weiterverarbeiten will.

  • Ich wuerde dir trotz deiner geringen Anzahl von Datensätzen zu SQLite raten. Das kommt mit Python schon mit, ist auch einfach nur eine Datei - aber erledigt schon vieles fuer dich, das du sonst muehselig zusammenfummelst. Wie zB das einfache updaten bestimmter Einträge, suchen nach Eintragen etc. Ausserdem ist SQLite sehr robust was das schreiben auf die SD angeht - besser als alles, was du selbst Hinfummeln kannst.

    Kleines Beispiel:

    Wenn du mehrerer Werte in einer Zeile hast, dann aendert sich das nur geringfügig.

  • Wenn ich nonickatall richtig verstanden habe, werden die Daten in den Konfigurationsdateien nicht von einem Programm geschrieben, sondern von Hand dort eingetragen. Da scheint mir ein für Menschen lesbares Format, sei es nun CSV oder was auch immer, geeigneter als sqlite. In diesem Fall würde ich mir überlegen, in welchem Format ich die Dateien gerne hätte, und dann meine Einleseroutine daran anpassen.

  • Manul dem ist denke ich nicht so - er möchte ja zB über SMS Berechtigungen freischalten. Ist also am Ende wirklich eher eine DB mit einer expliziten UI (ohne G!).

    Und ob man nun

    a;b;c;d
    1;2;3;4

    oder

    Code
    data = [
    ('a', 'b', 'c', 'd'),
    (1, 2, 3, 4)
    ]
    for row in data:
          conn.execute("INSERT ...", row)

    schreibt zum initialisieren ist IMHO sehr Wumpe.

Jetzt mitmachen!

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