Txt-Datei nach Zahlen durchsuchen und einer Liste hinzufügen

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
MariusAstriata
User
Beiträge: 4
Registriert: Sonntag 5. Dezember 2021, 14:23

Hallo,
ich möchte eine txt-Datei laden, die aus zufälligen Wörtern und Zahlen besteht, und die Zeilen der Datei nach Zahlen durchsuchen. Die Zahlen sollen dann in einer neuen Liste gespeichert werden.
Bisher habe ich:

Code: Alles auswählen

def laden(fileName):
        with open(fileName, "r") as fileObj:
            words = fileObj.read().splitlines() 
            x = []
            for i in words:
                try:
                    if  i.isdecimal():
                        x.append(float(i))
                except ValueError:
                    continue
            print(x)
            
laden("test.txt")
Meine txt-Datei kann wie folgt aussehen:
45.6
Test
34
Test
Test
45.5
3452.6
2423.3
45
4254635

Allerdings werden so nur int-Zahlen im String-Format der Liste hinzugefügt, aber keine float-Zahlen.
Wie schaffe ich es, dass sowohl int als auch float der Liste hinzugefügt werden?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du das isdecimal weglässt, so das einfach immer versucht wird, ein float zu erzeugen. Und (in ausreichender Näherung) sind floats die Übermenge von integern.
Benutzeravatar
sparrow
User
Beiträge: 4185
Registriert: Freitag 17. April 2009, 10:28

Etwas stimmt mit deinen EInrückungen nicht. Eingerückt wird immer mit 4 Leerzeichen. Keine Tabs, keine 8 Leerzeichen.

Ich halte es für falsch, eine Liste von Zeilen "words" zu nennen. Vor allem dann, wenn gar nicht immer Wörter in ihnen sind, sondern Zahlen.

Du brauchst den Inhalt der Datei nicht erst lesen und dann in Zeilen zu splitten. Wenn du über fileObj iterierst, sind das bereits die Zeilen.

Code: Alles auswählen

for line in fileObj:
Warum prüfst du ob etwas isdecimal() ist?
Wenn du eine Zeichenkette mit float in einen Float casten willst, wird immer ein ValueError geworfen, wenn das fehl schlägt. Wenn du vorher alles aussortierst, was etwas enthält das keine Ziffer ist (als auch alles, was einen Punkt enthält) dann kommt natürlich nie ein Float an.
MariusAstriata
User
Beiträge: 4
Registriert: Sonntag 5. Dezember 2021, 14:23

Vielen Dank! Hatte anscheinend einen Denkfehler. Hab es mit euren Tipps hinbekommen :geek:
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
from more_itertools import map_except


def main():
    with open("test.txt", encoding="ascii") as lines:
        numbers = list(map_except(float, lines, ValueError))
    print(numbers)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten