Skip to content

Python - Formatumwandlung str -> float

Python3
  • Seit einigen wenigen Tagen, beschäftige ich mich damit wie man ein paar Daten von einer Webseite ausliest und diese dann entsprechend weiterverarbeitet.

    Dabei musste ich so ziemlich das erste Mal in Python rechnen und was kam - Fehler! Die Formate passte nicht. Somit musste ich mich damit beschäftigen, wie man so was umwandelt.

    Nehmen wir an, ich erhalte solche Daten

    Formatierte Stringwerte aus dem Scraping ['20.605,00', '3.685,50', '3.013,80']
    

    Nehmen wir weiterhin an, es sind € Werte und ich möchte diese addieren. Die Liste von oben hat den Namen result.

    # String Werte umwandeln in float, damit ich damit rechnen kann
    f2 = []
    for count, value in enumerate(result):
        print("Value as String", value)
        # Tausenderpunkt entfernen!
        p = value.replace('.', '')
        # Umwandeln in float, dazu das Komma in einen Punkt umwandeln
        f = float(p.replace(',', '.'))
        # Floatwerte abspeichern
        f2.append(f) # f2.append(f)
    
    # Kontrollausgabe
    print(f2[0])
    print(f2[1])
    print(f2[2])
    
    addition = f2[0] + f2[1] + f2[2]
    print("Ergebnis Addition", addition)
    

    Ordentlich formatiert wird das mit

    import locale
    print(locale.format_string("%.2f", addition, grouping = True))
    

    Jetzt hatte ich mir noch die Frage gestellt, wie bekommt man da ein paar Zeilen weg. Ich hatte das schon mal irgendwo gemacht, wusste aber nicht mehr wo. Also Dokumentation im Netz gelesen und folgendes gefunden.

    # String Werte umwandeln in float, damit ich damit rechnen kann
    f2 = []
    for count, value in enumerate(result):
        print("Value as String", value)
        # Umwandeln in float, Tausenderpunkt entfernen und Komma in einen  Punkt umwandeln
        f = float((value.replace('.', '')).replace(',', '.'))
        # Floatwerte abspeichern
        f2.append(f) # f2.append(f)
    

    Auf den Wert (value) wird hier als erstes folgendes angewendet

    value.replace('.', '')
    

    Wir entfernen den Tausenderpunkt.

    Danach

    replace(',', '.')
    

    Das Komma für die Nachkommastellen ersetzen wir durch einen Punkt.

    Das Klammern wir mal alles entsprechend ein, verbinden das mit einem Punkt und auf den kompletten Ausdruck wenden wir ein Float an. Ferrtig 🙂

    Ok, es hat deutlich länger gedauert, bis ich das alles verstanden habe. Mehr Zeit als diesen Beitrag zu tippen, aber wie immer das Ergebnis zählt.

    Sollte hier Blödsinn stehen, oder noch besser, sollte jemand bessere Lösungen haben, bitte hier drunter. Ich freue mich über jede konstruktive Antwort.

    Ich weiß das einige Variablen Namen nicht PEP konform sind

  • Redis - Datenbank Zugriff mit Python

    Redis
    3
    0 Stimmen
    3 Beiträge
    93 Aufrufe
    FrankMF

    Ich bin mit der Lernkurve noch nicht so richtig zufrieden. Eine Frage die sich mir stellte, geht das einfacher? Der Ursprung meiner Datenbank Struktur liegt in einem anderen Projekt, wo ich versucht habe Daten permanent in einem File zu speichern. Dazu hatte ich damals JSON genommen. Deswegen auch diese Zeilen

    self.project = str(db_client.json().get('settings', '$..project')[0]) or self.project

    Gut, ich hatte dann mal ChatGPT gefragt, wie macht man das so 'normalerweise'? es kam eine Klasse heraus, die ich dann intensiv ausprobiert habe, ein wenig umgebaut usw. So lange, bis ich der Meinung war, ok ich habe es verstanden. Jetzt nutzte der Code auch mehr Redis Funktionen, wie

    self.client.hset('settings', name, json.dumps(data))

    Es waren jetzt folgende Funktionen drin

    hset hexists hdel hget

    Dokumentation -> https://redis.io/commands/hset/

    Beim Durchlesen des Codes hatte ich jetzt mehr das Gefühl, so muss das sein 🙂

    In RedisInsight sieht das dann jetzt so aus.

    393195f7-1017-4285-8fca-734ee6b4bff7-grafik.png

    Klasse class PortfolioSettings: def __init__(self, host='172.17.0.2', port=6379, db=0): if args.test_mode == 1: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=TEST[0]) else: self.client = redis.StrictRedis(host=SERVER_IP, port=port, db=LIVE[0]) def set_settings(self, name, data): """Init settings if db don't exist""" if not self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def edit_setting(self, name, data): """Edit an entry in settings""" if self.client.hexists('settings', name): self.client.hset('settings', name, json.dumps(data)) return True return False def delete_setting(self, name): """Delete an entry in settings""" return self.client.hdel('settings', name) def get_setting(self, name): """Get an entry in settings""" setting = self.client.hget('settings', name) return json.loads(setting) if setting else None def get_all_settings(self): """Get all entries in settings""" settings = self.client.hgetall('settings') return {k.decode(): json.loads(v) for k, v in settings.items()}

    Und hier die Initialisierung

    settings_data = PortfolioSettings() ##################### # Will only be executed if DB is not available! ##################### if not settings_data.get_all_settings(): # Settings initialisieren print("INIT") settings_data.set_settings("project", "Portfolio") settings_data.set_settings("version", "0.0.3") settings_data.set_settings("theme", "dark") settings_data.set_settings("url_list", ["https://www.onvista.de/aktien/Deutsche-Telekom-Aktie-DE0005557508"]) settings_data.set_settings("exchange_list", ['DKB','Smartbroker','BUX'])

    Teile der Klasse sind [KI-generiert]

    Ich war zufrieden und habe die Klasse dann in mein Projekt übernommen und den Code überall entsprechend angepasst.

  • PyPi - Pakete ein Sicherheitsproblem?

    Python3
    1
    0 Stimmen
    1 Beiträge
    72 Aufrufe
    Niemand hat geantwortet
  • Ruff - Linting

    Python3
    1
    0 Stimmen
    1 Beiträge
    58 Aufrufe
    Niemand hat geantwortet
  • Python - Frameworks

    Python3
    2
    0 Stimmen
    2 Beiträge
    76 Aufrufe
    FrankMF

    Und mal hier parken

  • Example Class

    Angeheftet Python3
    3
    0 Stimmen
    3 Beiträge
    103 Aufrufe
    FrankMF

    In meinem PywebIO Projekt tauchte heute ein alter Bekannter auf. Wenn ich einen Eintrag (innerhalb der Liste) löschte, war das etwas durcheinander 🤔

    Ja, den Fehler kenne ich schon was länger und stolper immer mal wieder drüber. Heute z.B.

    Also mal grübeln 🤓

    Das mache ich, wenn ich einen Eintrag lösche

    case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Ich mache folgendes

    lösche den Eintrag speicher die Liste lade die Liste baue den Tab wieder auf

    Das führt aber dazu, das meine Liste die als Objekt im Speicher steht nicht aktuell ist. Im Gegenteil, da ist dann etwas Unordnung. Ich brauchte also die Möglichkeit mein Objekt backups irgendwie zurückzusetzen.

    Mal gegoogelt und die Dinge sind manchmal wirklich total easy 🙂

    # clear dict backups.clear()

    Das leert das Objekt und im nächsten Schritt kann ich es wieder befüllen.

    Lösung case 'Yes': # delete entrie BackupList.delete((line - 1)) # save json BackupList.save_json() # clear dict backups.clear() # Load data from filesystem BackupList.load_json() # Reload Tab Backup backup()

    Problem erledigt. Damit ich das noch finde, wenn mein Kopf das nicht mehr hergibt, notiere ich das hier.

  • Python - Dict -> JSON und umgekehrt

    Python3
    1
    0 Stimmen
    1 Beiträge
    192 Aufrufe
    Niemand hat geantwortet
  • PyWebIO

    Angeheftet PyWebIO
    1
    0 Stimmen
    1 Beiträge
    160 Aufrufe
    Niemand hat geantwortet
  • Qt 5 Designer

    Python3
    1
    0 Stimmen
    1 Beiträge
    93 Aufrufe
    Niemand hat geantwortet