Variable aus anderer Funktion aufrufen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
ICookie
User
Beiträge: 9
Registriert: Freitag 23. März 2018, 10:39

Hallo,
ich versuche zur Zeit, mein Programm zu vollenden, was jedoch nicht ganz gelingen will.

Das Programm soll alles Daten eines Sensors in einem Ordner auslesen und diese dann in eine globale Datei, in die die Werte aller Sensoren kommen, schreiben. Jedoch weiß ich nicht wie ich die Variablen wieder in der Hauptfunktion aufrufen kann.
Als Fehler kommt dann immer, dass die Variablen nicht definiert sind. Global setzen kann ich sie auch nicht, weil sie dann nur noch einen einzigen Wert hätte.

Mein Programm bis jetzt: (kommen noch mehr Sensoren)

Code: Alles auswählen

#Alle Sensoren

import csv, os, time    
    
		
def Feinstaub():
    
    for filename in os.listdir("/home/pi/Documents/Feinstaubdaten"):
        with open("/home/pi/Documents/Feinstaubdaten/" + filename, 'r') as csvfile:
            reader = csv.reader(csvfile, delimiter=";", quotechar=' ')
            datenfs = list(reader)
            name= datenfs[0][0]
            pm25 = datenfs[2][2]
            pm10 = datenfs[2][3]
            datum = datenfs[2][0]
            uhrzeit = datenfs[2][1]
            pm25n = "PM 2.5"
            pm10n = "PM 10"
            einheit = "μg/m^3"
            filestr = os.path.join('/home/pi/Documents/Feinstaubdaten',filename)
            os.remove(filestr)

def main():
    Feinstaub()
    with open("/home/pi/Documents/Alle/Alle"+time.strftime("%Y%m%d_%H%M%S",time.localtime())+".csv", 'ab') as csvfile:
            file = csv.writer(csvfile, delimiter=';', escapechar=' ', quoting=csv.QUOTE_NONE)
            file.writerow([name, datum, uhrzeit, pm25, pm10])
            csvfile.close()
		
if __name__ == "__main__":
    main()
Danke schon mal im vorraus!
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,

diese Seite durcharbeiten, dann sollte sich deine Frage gelöst haben. Stichwort Rückgabewert
https://docs.python.org/2/tutorial/cont ... -functions
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@ICookie: warum stückelst Du in Zeile 9 Deinen Dateinamen mit + zusammen, statt wie in Zeile 20 richtigerweise os.path.join zu benutzen? Besser ist es sowieso, den Dateinamen nur einmal zu erzeugen und an beiden Stellen die selbe Variable zu benutzen. Noch besser ist es statt os.listdir glob.glob zu benutzen, dann ist der Pfad gleich dran. Einen konstanten String, wie Pfade, als KONSTANTE am Anfange des Programms definieren. Die Datei sollte schon wieder geschlossen sein, bevor Du sie löschst. Funktionen benennt man am besten nach Tätigkeiten, `Feinstaub` ist aber ein Substantiv. `

`strftime` ohne zweites Argument nimmt automatisch die aktuelle Zeit. Hier besser Stringformatierung und datetime.now benutzen. Möchtest Du die Datei wirklich im Binärmodus öffnen? `file` ist der Name der Datei-Klasse, die man nicht überschreiben sollte. Das close in Zeile 28 ist unnötig, wegen des with.

Zum Problem: der Programmfluß läuft nicht so, wie Du denkst, nachdem Feinstaub abgearbeitet ist, sind alle lokalen Variablen weg, als Rückgabewert würdest Du auch nur den letzten (oder ersten) Datensatz bekommen. Warum schreibst Du nicht in Feinstaub auch gleich innerhalb der for-Schleife in die Datei? Alternativ packt man alles in eine Liste und gibt die zurück.

Als Python-Fortgeschrittener würde man einen Generator schreiben:

Code: Alles auswählen

import os
import csv
import glob
from datetime import datetime as DateTime
   
FEINSTAUB_PATTERN = "/home/pi/Documents/Feinstaubdaten/*"
OUTPUT_FILENAME = "/home/pi/Documents/Alle/Alle{:%Y%m%d_%H%M%S}.csv"

def read_feinstaub_daten():
    for filename in glob.glob(FEINSTAUB_PATTERN):
        with open(filename) as csvfile:
            reader = csv.reader(csvfile, delimiter=";", quotechar=' ')
            # first line
            line = next(reader)
            name = line[0]
            # ignore second line
            next(reader) 
            # third line
            line = next(reader) 
            datum, uhrzeit, pm25, pm10 = line[:4]
            pm25n = "PM 2.5"
            pm10n = "PM 10"
            einheit = "μg/m^3"
            yield name, datum, uhrzeit, pm25, pm10
        os.remove(filename)
 
def main():
    with open(OUTPUT_FILENAME.format(DateTime.now(), 'a') as csvfile:
        output = csv.writer(csvfile, delimiter=';', escapechar=' ', quoting=csv.QUOTE_NONE)
        for data in read_feinstaub_daten():
            output.writerow(daten)
       
if __name__ == "__main__":
    main()
ICookie
User
Beiträge: 9
Registriert: Freitag 23. März 2018, 10:39

Danke schon mal für die ganzen Tipps und Ratschläge. Diese werde ich in meinem Programm für den Feinstaubsensor auch gleich umsetzen.

Ich wollte gerade deinen Code probieren, jedoch bekomme ich in Linie 28 bei dem "as" ein Syntax Error und weiß leider überhaupt nicht warum.

//EDIT:

Hab's gefunden. In Linie 28 hat eine Klammer gefehlt und in Linie 31 habe ich "daten" mit "data" ersetzt.
Trotzdem danke! Läuft super
Antworten