Fehler beim öffnen ersteller .csv Datei

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
DrKaiser
User
Beiträge: 1
Registriert: Mittwoch 5. Februar 2020, 16:33

Hallo,
Ich möchte Messergenisse in einer .csv Datei loggen, aber wenn ich die .csv Datei mit LibreOffice öffne erscheinen nur merkwürdige Zeichen. Wenn ich sie mit dem TextEditor öffnen möchte kommt die Meldung "The document was not UTF-8 valid". Ich bin ein ziemlicher Anfänger mit Python, was mache ich falsch und wie kann ich die Daten richtig anzeigen lassen?

Code: Alles auswählen

import adafruit_ccs811
import Adafruit_DHT
import busio
import time
import datetime
from board import *
import sys
import csv


# I2C-Bus definieren
i2c = busio.I2C(SCL, SDA)

# CCS811 (CO2-Sensor) an den I2C-Bus anbinden
ccs = adafruit_ccs811.CCS811(i2c)

# Sensor Typ auswählen (DHT11), GPIO Pin auswhählen (GPIO6) und Daten in Variable schreiben
sensor = Adafruit_DHT.DHT11
pin = 6

# CCS811 (CO2-Sensor) auslesen
def get_CO2():    
    CO2 = ccs.eco2
    CO2 = str(CO2)
    return(CO2)

# Temperatur auslesen
def get_temp():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    Temperatur = temperature
    Temperatur = str(Temperatur)
    return(Temperatur)

# Luftfeuchtigkeit auslesen
def get_LuFe():
    humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
    Luftfeuchtigkeit = humidity
    Luftfeuchtigkeit = str(Luftfeuchtigkeit)
    return(Luftfeuchtigkeit)

# Datum auslesen
def get_Datum():
    Heute = datetime.datetime.now().strftime("%Y-%m-%d")
    Heute = str(Heute)
    return(Heute)

# Uhrzeit auslesen
def get_Zeit():
    Uhrzeit = datetime.datetime.now().strftime("%H:%M:%S")
    Uhrzeit = str(Uhrzeit)
    return(Uhrzeit)

# Gemessene Werte in eine CSV-Datei schreiben
def write_to_csv():
    with open('/home/pi/Klimalogger/Logg_Messwerte.csv', mode='a') as Logg_Messwerte:
        sensor_write = csv.writer(Logg_Messwerte, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        sensor_write.writerow([get_Datum(),get_Zeit(),get_temp(),get_LuFe(),get_CO2()])
        return(write_to_csv)
        

write_to_csv()
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DrKaiser: Erste Massnahme wäre Textdateien immer explizit mit einer Angabe der Kodierung zu öffnen. `open()` hat dafür ein `encoding`-Argument. UTF-8 ist eigentlich immer das sinnvollste solange man nicht garantieren kann das es bei ASCII bleibt oder man Software hat die eine andere Kodierung erwartet.

Die `str()`-Aufrufe gehören eher nicht in die `get_*()`-Funktionen und `strftime()` liefert bereits eine Zeichenkette, da macht `str()` keinen Sinn. Man sollte auch Zeit und Datum nicht in zwei getrennten Aufrufen ermitteln und auch nicht in zwei Spalten speichern. Das ist *ein* Wert. Durch die getrennten Aufrufe zum ermitteln werden da aber zwei unterschiedliche Zeitpunkte ermittelt und jeweils ein Teil davon genommen.

Namen sollte keine kryptischen Abkürzungen enthalten. CO2 ist okay, weil das eine gängige Abkürzung ist, aber LuFe nicht. Namenskonvention ist klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

``return`` ist keine Funktion, das sollte man also auch nicht so schreiben als wäre es ein Funktionsaufruf. Man muss auch nicht jedes Zwischenergebnis an einen Namen binden, zum Beispiel nur um den Namen dann in der nächsten Zeile mit einem ``return`` zu verwenden.

Warum die `write_to_csv()`-Funktion sich selbst als Rückgabewert hat ist mir ein Rätsel.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten