Wie wandle ich bei meinem Programm in Python 3 strings in int um?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das sollte so funktionieren:

numbers = [float(line.strip()) for line in open("werte.txt",encoding=utf-8").read().replace(",",".").splitlines()

Und hier noch die etwas längere Variante, die für Python-Anfänger vermutlich etwas besser zu lesen/verstehen ist ^^:

numbers = []
f = open("werte.txt",encoding=utf-8")
line = f.readline()
while line != "":
    line = line.strip()
    line = line.replace(",",".")
    line = f.readline()
    try:
        number = float(line)
        numbers.append(number)
    except ValueError:
        pass
f.close()

Am Ende beider Varianten hast du eine Liste namens numbers, in der sich die eingelesenen Zahlen befinden.

P.S.: Variante 2 hat darüber hinaus noch den Vorteil, dass bei einer ungültigen Zahl nicht das ganze Programm abschmiert... ^^

Tatitutut 
Fragesteller
 22.05.2018, 23:36

Also leider klappt beides nicht. Aber ich kann da schon die Idee verstehen, nur den Schluss im 2. Beispiel nicht.

Also zu 1. Wo soll die Klammer geschlossen werden? Nach float() und ganz am Ende kommt Invalid-Syntax-Fehler. Ich kenne hier alle Befehle, aber diese Verschachtelung direkt nebeneinander ist für mich noch zu schwer zum verstehen. Schritt für Schritt kann ich besser nachvollziehen, auch in welcher Reihenfolge das Programm arbeitet und "gefüttert werfen muss".

Im 2. Bleibt die Liste leer.

0
Isendrak  23.05.2018, 00:02
@Tatitutut
Also zu 1. Wo soll die Klammer geschlossen werden?

Oh ScheiXe! Da hab ich doch glatt n paar "fiese Fehler" dringehabt... ^^;;

So müsste es funktionieren:

numbers = [float(line.strip()) for line in open("werte.txt",encoding="utf-8").read().replace(",",".").splitlines()]
Im 2. Bleibt die Liste leer.

Probier evtl. mal das pass in Zeile 12 durch print("Na da kann ich aber keinen Float draus machen: \"{0}\"".format(line)) zu ersetzen.

P.S.: Wie TeeTier schon sagte, zumindest ein Auszug aus der Textdatei wäre schon ganz praktisch. (Verwende optimalerweise pastebin.com o.ä.. Der Editor hier ist teilweise etwas seltsam, vor allem dann, wenn ein Text möglichst exakt mit dem "Original" übereinstimmen soll.)

0
Tatitutut 
Fragesteller
 23.05.2018, 00:27
@Isendrak

Ich bin zwangsweise mit dem Handy in gutefrage.net zugange, daher kann ich grad nur so schreiben.

1. Kommt als int raus (juhu!), aber warum wird plötzlich auf eine Nachkommastelle gerundet, wenn die Zahlen in meiner Datei jetzt ganze Zahlen sind? Für meine Berechnungen dürfte mir in den Naturwissenschaft sowas auf keinen Fall passieren, dann hätte ich sofort eine falsche Angabe der Genauigkeit. Rundet der float()-Befehl automatisch?

2. Statt des pass wird dann print ausgeführt. Die leere Liste folgt

Ich verstehe ab und mit try gar nichts im 2. Befehl. Wir können den auch erst mal nicht weiter prüfen. Das ist einfach noch zu schwer für mich.

0
Tatitutut 
Fragesteller
 23.05.2018, 00:30
@Tatitutut

Wenn mein Laptop nicht spiegeln würde, hätte ich ein Bild gemacht. Also es ist eine langweilige Textdatei die nur Zahlen untereinander stehen hat. Pro Zeile nur eine Zahl.

0
Isendrak  23.05.2018, 00:59
@Tatitutut
  1. Als int? Da sollte eigentlich ein float rauskommen (Zahl mit Nachkommastellen). Und runden tut da eigentlich gar nix... (Ggf. mal n paar Beispielwerte?) Wenns aber definitiv nur ganze Zahlen sind, dann könntest auch int statt float benutzen.
  2. Dann ist irgendwas mit den Zahlen in der Textdatei nicht in Ordnung. Was genau gibt print denn aus?
0
Tatitutut 
Fragesteller
 23.05.2018, 01:37
@Isendrak

Du hast wohl Recht. Ich habe erst vorhin etwas über den Befehl float() gelesen und noch nicht mit ihm gearbeitet und den Output für int gehalten. Ich werd mich über float() noch ausführlich informieren müssen.

Wenn ich statt float() int() nehme, kommen exakt die Zahlen aus der Liste raus! Riesen Dank!

Diese Lösung ist für mich am verständlichen und besten.

Wenn ich sie umformulieren möchte, damit ich mir über mehrere Zeilen alles verständlich kommentieren kann, wie würde ich nach der Schleife alles in eine Liste packen? Ich würde vor der Schleife eine leere Liste schreiben: l = [ ] und nach der Schleife l.append() nutzen. Wie sage ich dann Python, dass er den Output aus der Schleife nehmen soll? Ist an der Stelle eine Zuweisung möglich?

f= open("numbers.txt", encoding="utf-8")

numbers = f.read ()

f.close

l= [ ]

for line in numbers.replace(",",".").splitlines():

int(line.strip())

?????

l.append(???)

print (l)

0
Tatitutut 
Fragesteller
 23.05.2018, 01:55
@Isendrak

Die 2. Lösung klappt von Anfang an! Ich hab noch meinen Listennamen l beibehalten und den abgerufen. Kein Wunder, dass diese dann leer blieb!

Und ich habe durch deine Anordnung und Ausführung von einigen Zeilen aus dem 2. Beispiel zur Lösung meiner letzte Frage übernommen und es klappt auch so. Dein Lösungsweg bleibt aber schöner.

Die 2. Lösung werde ich nutzen, um mit dem Programm weiterzulernen.

Ich bedanke mich herzlichst!!! Das war richtig hilfreich und verständlich mit Lernerfolg! Nach 2 Wochen Folter hab ich endlich eine Lösung, die ich verstehe! 😀

Danke für die lang beanspruchte Zeit und Mühe!!! Ich bin dir echt überaus dankbar!! 🍻

0

probier erstmal mit number.isdigit() ob python den string überhault als int interpretieren kann.

Tatitutut 
Fragesteller
 22.05.2018, 22:47

Da kommt FALSE raus , wenn ich es nach l = list (numbers) eingebe.

Ich hatte auch noch den einfachen Befehl, um die Liste zu erzeugen,

l = [numbers],

aber da sieht der Output noch hässliger aus: Bsp: ['123\n535\n489\n....]

Wenn ich l = list(numbers) nutze, dann sieht der Output so aus: ['123', '535', '489',...].

In der ursprünglichen .txt-Datei stehen diese Zahlen jeweils pro Zeile untereinander:

123

535

489

...

0
user373h383  22.05.2018, 22:53
@Tatitutut

\n ist ein Steuerzeichen und bedeutet "neue Zeile". Es wird genauso bahandelt wie jedes normale Zeichen auch, deswegen kann es vorkommen dass du es in bestimmten Fällen zu sehen bekommst. Allerdings kannst du aus einem Zeilenumbruch keinen int erzeugen (Ist ja auch keine Zahl :D ).

Vermutlich hängt das Steuerzeichen immernoch in den einzelnen Strings, vllt musst du eine andere Methode nutzen um die Textdatei Zeilenweise einzulesen, und nicht als ganzes. Das Steuerzeichen \n sollte dann nicht mitgelesen werden.

1
Tatitutut 
Fragesteller
 22.05.2018, 22:57
@user373h383

Deshalb nutze ich den Befehl list(), aber ich bekomme Strings in Form von '123' raus und nicht die int als 123. Ich möchte ja eben deshalb die str in int umwandeln. Nehmen wir nur ganze Zahlen, so fubtioniert das bei mir dennoch nicht. Und ich bekomme für number.isdigit() immernoch FALSE, obwohl meine Textdatei eindeutig nur Zahlen ohne Buchstaben und Sonderzeichen untereinander zeilenweise enthält.

0
user373h383  22.05.2018, 23:04
@Tatitutut

Wenn du in einer Textdatei die Taste "Enter" drückst, dann bekommst du dort automatisch das Steuerzeichen \n eingebaut. Ohne dieses Zeichen würde das Textprogramm nicht wissen, wo eine neue Zeile beginnt. Du als Benutzer bekommst dieses "Zeichen" aber nicht zu Gesicht, es ist ja kein richtiger Buchstabe, nur ein logischer Wert der durch '\n' in Programmierumgebungen ausgedrückt wird. Wenn du deine Textdatei in Python einliest, und deine Textdatei mehrere Zeilen hat, dann wird auch das Steuerzeichen '\n' mit eingelesen (Damit der Text auch in anderen Programmen wieder vernünftig mehrzeilig angezeigt werden kann). Dieses \n steckt jetzt in deinen Werten mit drin, und Python kann aus 1234\n keine Zahl bilden. Du kannst entweder das Zeichen '\n' aus dem String filtern, oder die Textdatei direkt Zeilenweise ohne das Steuerzeichen einlesen.

0
Tatitutut 
Fragesteller
 22.05.2018, 23:08
@user373h383

Wie soll das funktionieren?

Mit dem Befehl list(numbers) wird im Output aber kein \n angezeigt. Dann werden nur die Strings aufgelistet in einer Liste : ['123', '456' usw]. Hast du das mal ausprobiert?

0
user373h383  22.05.2018, 23:12
@Tatitutut

Naja, ein '\n' ist ja auch nicht immer sichtbar (Es ist wie gesagt kein richtiges Zeichen, nur ein logischer Wert).

Du hast oben bereits die Fehlermeldung gezeigt:

" invalid lateral for int() with base 10: '\n' "

Übersetzt heißt das: Das Zeichen '\n' mit dem Wert 10 kann nicht in einen int umgewandelt werden.

Auch wenn du das \n nicht siehst, es ist noch da. :)

0
user373h383  22.05.2018, 23:32
@user373h383

Ohh, jetzt habe ich deinen Fehler gesehen :D

l ist deine liste, nicht numbers

Also muss dein Code so lauten:

l = list (numbers)

for number in l():

int(number)

0
Tatitutut 
Fragesteller
 22.05.2018, 23:58
@user373h383

Führt Python aus, aber es die Zahlen bleiben noch strings.

0
Tatitutut 
Fragesteller
 22.05.2018, 23:59
@user373h383

die For-Schleife klappt so auch nicht. Fehler: 'list' object is not callable

0
user373h383  23.05.2018, 00:07
@Tatitutut

Ja, die () in der Schleife müssten weg. Das Eegebnis von int(number) ist allerdings ein int, du musst ihn nur auf eine Vadiable legen. zB:

zahl = int(number)

dann kannst du mit 'zahl' (dem int) rechnen und machen was du willst

0
Tatitutut 
Fragesteller
 23.05.2018, 00:37
@user373h383

Also mir fällt es mit dem minimalistischen Schreibstil ganz ohne Beispiel ganz schwer dir zu folgen ind nir nach Komentaren im Programm zu zusammenziwürfeln, bzw. ich kann dir gar nicht mehr folgen.

Ich kann keine Klammern weglassen und eine Variable einfachso einführen funktioniert auch nicht, wenn ich dann noch mehr verschachteln muss.

Ich danke Dir an der Stelle einfach für deine Ideen! So hab ich auch mehr rumprobieren können.

0
user373h383  23.05.2018, 00:47
@Tatitutut

Tut mir leid, ich sitze gerade im Zug und hab nur das Handy griffbereit :D

Auf jedenfall weiterhin viel Erfolg!

1
Tatitutut 
Fragesteller
 23.05.2018, 01:00
@user373h383

Gar kein Problem. Wäre ich kein blutiger Anfänger, könnte ich dir sicherlich auch intuitiv folgen. Du hast Dir ja auch Mühe gegeben, also großen Dank dafür.

Danke! Dir Gute Fahrt !

0
Tatitutut 
Fragesteller
 23.05.2018, 01:02
@user373h383

Und ohne deine Geduld hätte ich's mit den \n wohl gar nicht mehr verstanden :D

0
user373h383  23.05.2018, 07:03
@Tatitutut

So etwas schriftlich über ein Forum abzuwickeln ist aber auch echt nicht einfach. Eigentlich müsste man sich für einen richtigen Lernerfolg hinsetzten, alle Fragen klrären und eine Lösung ausarbeiten, ohne ein Handy dazwischen... Bei mir auf der Arbeit sitzem wir nicht umsonst die meiste Zeit zu zweit vor einem Rechner, wenn mal was nicht klappt.

1

Wenn die Zahlen als Strings in einer Liste vorliegen, kannst du ganz einfach mit ...

int_list = list(int(x) for x in str_list)

... eine int-Liste daraus machen. :)

Hättest du mal ein paar Zeilen des Inhalts deiner Textdatei gepostet, wüsste man das genaue Format und könnte evtl. auch noch sagen, wie du die möglichst elegant parsen kannst, aber ohne weitere Infos geht das leider nicht. Sorry. ><

Tatitutut 
Fragesteller
 22.05.2018, 22:53

Ich blicke da noch nicht so ganz durch.

Wende ich das so an, muss ich ja zuvor str_list definiert haben, was wohl mit str_list = list(numbers) passieren sollte?

Dann kommt die Fehlermeldung: invalid lateral for int() with base 10: '\n'

Meine Textdatei hat die Zahlen zeilenweise untereinander stehen, z.B.

123

456

789

...

1
TeeTier  22.05.2018, 23:10
@Tatitutut

Sehr gut, damit kann man etwas anfangen! Warum nicht gleich so? :)

Dann mach es doch einfach so:

import codecs

int_list = []
with codecs.open('zahlen.txt', 'r', 'utf-8', 'strict') as fh:
  for line in fh:
    line = line.strip()

    if line:
      try:
        int_list.append(int(line))
      except:
        pass

# mach was mit der Integer-Liste ...
for i in int_list:
  print(i)

Der Code ist nicht getestet, sollte aber funktionieren. :)

Viel Spaß noch! :)

1
Tatitutut 
Fragesteller
 22.05.2018, 23:20
@TeeTier

Hat geklappt! Leider verstehe ich nur kaum etwas davon, was gemacht worden ist. Aber herzlichen Dank für die Mühe und Hilfe!

1

Falls noch niemand eine funktionierende Lösung gepostet hat:

String lässt sich nicht direkt in Integer umwandeln. Als ich das gleiche Problem hatte musste ich dem String erst in eine Float Zahl umwandeln, wenn ich mich nicht irre.

Also:

x = "2"

x_als_Zahl = int(float(x))

Tatitutut 
Fragesteller
 23.05.2018, 00:06

l = list(int(float(numbers))

So erhalte ich die Meldung could not convert string to float

Ich weiß nicht wie ich das in eine Schleife packen können sollte. Ich kann das ja nicht für jede einzelne Zahl einzeln tippen.

Wie hättest du das in dem Fall geschrieben?

0
YugiohFan17  23.05.2018, 09:42

L = list() for i in Range(len(L)) : #eine for Schleife um alle Elemente der Liste zurückzugeben L(i) = int(float(L(i))) # das Element von i in der Liste wird jeweils zu einem int konvertiert. So müsste es eig funktionieren

0