Seite 1 von 1

Zahlen aus CSV im richtigen Format in Listen schreiben

Verfasst: Donnerstag 7. Januar 2021, 19:16
von alfredsc
Beim Versuch Zahlen aus einer CSV-Liste in eine Python-Liste zu schreiben, werden die Zahlen immer in Anführungszeichen zur Liste hinzugefügt.
Da ich anschließend den niedrigsten und den höchsten Wert auswerten möchte, zeigt es mir aufgrund der Anführungszeichen falsche Ergebnisse (zumindest bei Minustemperaturen) an.
Was mache ich falsch bzw. wie kann ich die Werte als Zahlen hinzufügen?

import os
import csv
temperatur = []
os.chdir("C:\\WPLOG\\2020_12")
exampleFile = open('01.csv')
exampleReader = csv.reader(exampleFile)
exampleData = list(exampleReader)
zahl1 = (exampleData[4][1])
temperatur.append(zahl1)
...
zahl10 = (exampleData[13][1])
temperatur.append(zahl10)
minimal = min(temperatur)
maximal = max(temperatur)
print(minimal)
print(maximal)

Alternativ wäre ich auch offen für einen Vorschlag wie ich aus der CSV-Datei direkt die niedrigste und höchste Temperatur auslesen kann. Es ist pro Tag eine Datei in der immer wieder die Temperatur geloggt wird. Mich interessiert die jeweils niedrigste und höchste Tagestemperatur.

Re: Zahlen aus CSV im richtigen Format in Listen schreiben

Verfasst: Donnerstag 7. Januar 2021, 20:00
von Sirius3
os.chdir sollte man nicht verwenden, weil es den globalen Zustand des Programms ändert.
Benutze statt dessen absolute Pfade.
csv.reader wandelt keine Datentypen um, das must Du mit float oder int selbst machen.
Dateien sollte man auch wieder schließen, am besten durch Benutzung von with.
Warum heißen Deine Variablen example...? Das hat doch keinen Mehrwert. Variablennamen schreibt man auch komplett klein.
Statt Variablen durchzunummerieren benutze Listen. Bei Dir ist der Zwischenschritt, das alles an unterschiedliche Variablen zu binden ist auch unnötig.

Code: Alles auswählen

import csv
from itertools import islice

CSV_FILENAME = "C:\\WPLOG\\2020_12\\01.csv"

with open(CSV_FILENAME, newline="", encoding="utf8") as lines:
    data = csv.reader(lines)
    temperatures = []
    for row in islice(data, 4, 14):
        temperature = float(row[1])
        temperatures.append(temperature)

Re: Zahlen aus CSV im richtigen Format in Listen schreiben

Verfasst: Donnerstag 7. Januar 2021, 20:01
von __blackjack__
@alfredsc: Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und was soll dieser `example`-Prefix?

Verwende komplette Pfade statt `os.chdir()`. Das verändert Prozessglobalen zustand, skaliert nicht, und kann zu schwer zu findenen Fehlern führen wenn der Arbeitspfad an irgendeiner Stelle im Code ein anderer sein sollte als man erwartet.

Dateien die man öffnet, sollte man auch wieder schliessen. Am besten in dem man die ``with``-Anweisung verwendet.

Bei Textdateien sollte man die Kodierung mit angeben und für das `csv`-Modul ist es wichtig das `newline`-Argument mit einem passenden Wert zu übergeben. Sie Dokumentation vom `csv`-Modul.

Wofür stehen denn die Auslassungspunkte? Ich hoffe mal nicht, dass Du da `zahl1` bis `zahl10` definierst in dem Du den ersten Index manuell hochgezählt da 10× hingeschrieben hast‽ Für so etwas gibt es Schleifen. Und statt die Namen zu nummerieren würde man eine Liste verwenden. Also das was Du ja auch schon tust, darum stellt sich die Frage warum da `zahl1` bis `zahl10` definiert werden?

Der Namen `zahl` ist auch falsch, denn wie Du ja schon festgestellt hast, sind das keine Zahlen sondern Zeichenketten. Die musst Du in eine Zahl umwandeln wenn Du sie als Zahl(en) weiterverarbeiten willst.

`temperatur` ist als Name irreführend weil es nicht *eine* Temperatur ist, sondern anscheinend Zehn.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
from itertools import islice


def main():
    with open(
        R"C:\WPLOG\2020_12\01.csv", encoding="ascii", newline=""
    ) as file:
        temperaturen = [
            float(row[1]) for row in islice(csv.reader(file), 4, 14)
        ]
    print(min(temperaturen))
    print(max(temperaturen))


if __name__ == "__main__":
    main()