String in Float konvertieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Acid700
User
Beiträge: 8
Registriert: Montag 1. März 2021, 17:06

Hallo,
ich bin ziemlich neu in Python und muss für einen Kurs in der Uni ein Programm schreiben, dass mir eine .txt Datei auswertet und bestimmte Hypothesen überprüfen kann.
Ich habe die Werte einlesen lassen und als Variablen definiert.
Mein ertses Problem (von wahrscheinlich vielen die folgen werden) ist das ich eine Variable nicht in float umwandeln kann um einen Mittelwert zu berechnen. Python zeigt mir nur "ValueError: could not convert string to float: 'Alter'"

Das ist mein jetziger Code

lines_in = open("Datensatz1.1.txt").readlines()
lines_in.sort()



Alles = []
Geschlecht = []
Alter = []
Schulausbildung = []
Berufstaetigkeit = []
Parteipraeferenz = []
Sorge = []

Gesamt_A = 0
SD_A= 0

for lines in lines_in:
Alles = lines.split(";")
Geschlecht = Alles[0]
Alter = Alles[1]
Schulausbildung = Alles[2]
Berufstaetigkeit = Alles[3]
Parteipraeferenz = Alles[4]
Sorge = Alles[5]

float(Alter) #string in float
Alter_num = float(Alter)
Gesamt_A = Gesamt_A + Alter_num

Hat jemand eine Idee woran es liegt?
Benutzeravatar
__blackjack__
User
Beiträge: 13930
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Acid700: Ja, das liegt daran das man eine Zeichenkette die das Wort "Alter" enthält, nicht in einer Zahl umwandeln kann. Welche sollte das denn auch sein? Kann es sein, dass die Daten eine Kopfzeile enthalten?

Und falls das eine CSV-Datei ist, würde man die mit dem `csv`-Modul einlesen. Oder vielleicht auch gleich mit `pandas.read_csv()` wenn man danach Mittelwerte von Spalten berechnen will.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Verwende keine kryptischen Abkürzungen. Also `gesamt_alter` statt `gesamt_a`. Was `sd_a` bedeuten soll, ist noch schwerer zu erraten.

Du bindest leere Listen an Namen die nie verwendet werden, weil Du in der Schleife an die selben Namen dann Zeichenketten bindest.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen schreibt man nach Konvention komplett klein. Dateien die man öffnet sollte man auch wieder schließen, am besten, indem man das with-Statement benutzt.
`Alles`, `Geschlecht`, `Alter`, `Schulausbildung`, `Berufstaetigkeit`, `Parteipraeferenz` und `Sorge ` werden mit einer leeren Liste initialisiert, die gar nicht gebraucht werden, das kann also alles weg.
`SD_A` wird nirgends verwendet.
Wenn Du über Zeilen iterierst, was erhältst Du als ein Element? Keine `lines`, sondern eine `line`!
Das Ergebnis von float(Alter) mußt Du auch irgendwo speichern, was Du ja eine Zeile später auch tust.
Benutze keine Abkürzungen. Was hat der Gesamt_Aktienkurs mit einem Alter zu tun?

Wir kommen also zu:

Code: Alles auswählen

with open("Datensatz1.1.txt") as input:
    lines = sorted(input)

gesamt_alter = 0
for line in lines: 
    geschlecht, alter, schulausbildung, berufstaetigkeit, parteipraeferenz, sorge = line.split(";")
    alter_num = float(Alter)
    gesamt_alter += alter_num
Kann es sein, dass Du gar keine Text-Datei hast, sondern in Wirklichkeit eine CSV-Datei? Dann benutze das csv-Modul.

Code: Alles auswählen

import csv

with open("Datensatz1.1.txt", encoding="UTF8", newline="") as input:
    rows = csv.DictReader(input, delimiter=";")
    gesamt_alter = 0
    for row in rows:
        gesamt_alter += row['Alter']
Zum Fehler: "Alter" ist keine Zahl. Wahrscheinlich enthält die Datei einen Header, den Du aber nicht richtig behandelst.
Acid700
User
Beiträge: 8
Registriert: Montag 1. März 2021, 17:06

Danke für die schnellen Antworten!
Die Datei hatte eine Kopfzeile, die habe ich jetzt glöscht und mit dem neuen Code hat es auch geklappt :)
Antworten