Python Code optimierbar?

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,

nochmal kurz eine Frage:
Kann ich an diesem Code irgendetwas optimieren? Mich persönlich stört es, dass ich Uhrzeit und Datum trennen musste, aber wenn ich das mit ";" im String getrennt hätte, hätte das quotechar in der csv wieder ein ' ' davor gemacht und das will ich nicht. Gibt es dafür eine bessere Lösung?

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import serial, time, struct, csv
from datetime import datetime as DateTime

ser = serial.Serial()
ser.port = "/dev/feinstaub"
ser.baudrate = 9600

ser.open()
ser.flushInput()

byte, lastbyte = "\x00", "\x00"

#STRINGS
OUTPUT_FILENAME = "/home/pi/Documents/Feinstaubdaten/Feinstaubdaten{:%Y%m%d_%H%M%S}.csv"
Name = ["Feinstaubsensor"]
Beschriftung = ["Datum","Uhrzeit","PM2.5","PM10"]
Datum = "{:%Y:%m:%d}"
Uhrzeit = "{:%H:%M:%S}"

while True:
    lastbyte = byte
    byte = ser.read(size=1)
    
    if lastbyte == "\xAA" and byte == "\xC0":
        sentence = ser.read(size=9)
        readings = struct.unpack('<HHxxBBB',sentence)

        
        pm_25 = readings[0]/10.0
        pm_10 = readings[1]/10.0

        with open(OUTPUT_FILENAME.format(DateTime.now()), 'a') as csvfile:
            output = csv.writer(csvfile, delimiter=';', escapechar=' ', quoting=csv.QUOTE_NONE)
            output.writerow(Name)
            output.writerow(Beschriftung)
            output.writerow([Datum.format(DateTime.now()), Uhrzeit.format(DateTime.now()), pm_25, pm_10])
        
        time.sleep(5)
Danke!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@ICookie: Die Parameter kann man sertial.Serial direkt bei der Initalisierung übergeben. lastbyte wird in Zeile 14 ein Wert zugewiesen, der nie benutzt wird. DateTime.now sollte nur einmal aufgerufen werden, sonst sind die einzelnen Angaben nicht synchron.
ICookie
User
Beiträge: 9
Registriert: Freitag 23. März 2018, 10:39

Und wie mache ich das am besten?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Was konkret verstehst Du denn nicht?
ICookie
User
Beiträge: 9
Registriert: Freitag 23. März 2018, 10:39

Wie ich das mache, dass ich Datetime.now nur einmal aufrufen muss, weil sonst eben das oben genannte Problem auftritt. Hab schon alles probiert was ich ansatzweise wusste.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man etwas nur einmal tun will, aber das Ergebnis mehrfach benutzen, dann muss man sich das merken. In einer Variablen.

Code: Alles auswählen

a = tuwas()
print(a, a, a, a,)
ICookie
User
Beiträge: 9
Registriert: Freitag 23. März 2018, 10:39

Ich hab's jetzt mal so gemacht:

Code: Alles auswählen

from datetime import datetime

now = datetime.now().strftime("%Y-%m-%d;%H:%M:%S")
Datum, Uhrzeit = now.split(";")
Geht das auch noch einfacher oder passt das so?
Antworten