Umwandeln verschiedener Datentypen.

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
Schlangenmensch
User
Beiträge: 73
Registriert: Freitag 18. Februar 2022, 10:13

Hallo,

ich stehe gerade vor dem Problem, dass ich eine Zahl die ich aus einer Datei entnehme, im weiteren Programmverlauf nicht weiterverarbeiten kann. Die Zahl die aus der Datei stammt wird als string erkannt. Ich möchte diese Zahl jedoch als int weiterverarbeiten.

Meine Frage, kann ich die Datei öffnen und im Programm festlegen das der Inhalt als int gelesen/ausgegeben wird? Oder wie kann ich den gelesenen Wert in Int wandeln?


Für Euere Hilfe bin ich sehr dankbar.

Code: Alles auswählen

with open("/xxx/xxx/xxx/testtext.txt","r+") as f:

    datei=f.read()

    print(type(datei + ("\n")))  #Der Wert von (datei) soll im weiteren Verlauf um 1 erhöht  und neu in die Datei geschrieben werden.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

text = "12345"
zahl = int(text)
datei ist ein ganz bescheidener Name fuer den *Inhalt* einer Datei, vor allem, wenn der offensichtlich eine Bedeutung hat. Also mindestens mal muss das inhalt heissen, besser noch zaehler oder was auch immer das dann sein soll. Einen solchen Dateizaehler zu bauen ist auch eher umstaendlich und ungewoehnlich, und weniger robust, als man denkt, wenn man es naiv macht. Benutz sqlite dafuer, wenn es keinen guten Grund gibt, das nicht zu tun.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Dateimodus "r+" ist eigentlich nie sinnvoll, Text-Dateien liest man entweder, oder man schreibt sie. Was sollen die Klammern um "\n"? Und warum überhaupt den Typ eines Ausdrucks ausgeben, der öffensichtlich ein String sein muß, weil sonst die "Addition" nicht funktionieren würde.
Heutzutage würde man für das einfache Lesen des gesamten Textinhalts pathlib.Path verwenden:

Code: Alles auswählen

content = Path("/xxx/xxx/xxx/testtext.txt").read_text()
counter = int(content)
Schlangenmensch
User
Beiträge: 73
Registriert: Freitag 18. Februar 2022, 10:13

Vielen Dank für Euere Antworten.

Ich werde Eure Tips mal Anwenden und sehen ob ich weiter komme.

@Deets, ich muß glaube ich erstmal mit den einfachsten Sachen in Python klarkommen, bevor ich mich noch auf SQLLITE stürze. Das Optimieren der Programme wird dann auch hoffentlich die Zeit und die Erfahrung bringen.

@Sirius, ich wollte mit "r+" versuchen den "Inhalt" auszulesen, diesen mit 1 addieren und den neuen Wert dann wieder in die Datei schreiben. Vermutlich wäre es dann besser die Datei für's Lesen und Schreiben seperat zu öffnen, sofern der "Dateizähler" sinnvoll wäre.

Das "\n" ist nur ein überbleibsel, da ich dachte der "neue" Wert wird/wurde in der Konsolen mit dem Programmteil den ich hier nicht aufgeführt habe überschrieben.

Beim Typ wusste ich nicht, dass der Inhalt der Datei automatisch als str gehandelt wird obwohl es Zahlen sind.



Nochmals vielen Dank für Eure Hilfe.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir ist der Punkt entgangen: du DENKST was du machst ist einfach. So wie es einfach ist, mit nem Schraubenzieher im Starkstromkasten zu hantieren. Aber wehe, wenn’s daneben geht. Eine Datei sicher vor Abstürzen zum falschen Moment zu manipulieren ist schon etwas komplizierter. Machbar, aber am Ende kann man die notwendige Zeit zum lernen von SQLite sinnbringender investieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Schlangenmensch: Der Hinweis von __dees__ mit SQLite hat nichts mit Optimierung sondern mit korrekter Programmierung zu tun. Wenn man das mit der Datei mit dem Zähler tatsächlich *robust* hinbekommen will, wird das mindestens genau so kompliziert als wenn man einfach SQLite verwenden würde.

Eine Datei enthält im Grunde immer Zahlen, nämlich eine Folge von Bytes. Wenn man die als Textdatei öffnet, dann wird beim schreiben und lesen zwischen den Bytes in der Datei und den Zeichenketten im Programm umgewandelt, also hat man da dann nur mit Zeichenketten im Programm zu tun. EIne weitere, davon unabhängige Frage ist was die Bytes oder Zeichenketten bedeuten. Bei Dir beschreiben die eine Folge von Ziffern die zusammen eine Zahl ergeben. Davon weiss aber das Dateiobjekt nichts.

Man sollte beim Umgang mit Textdateien explizit eine Kodierung angeben. In diesem Fall tut es einfach ASCII, weil sowohl die Ziffern als auch das Zeilenende in ASCII enthalten sind.

Code: Alles auswählen

    counter_file_path = Path("/xxx/xxx/xxx/testtext.txt")
    counter_file_path.write_text(
        str(int(counter_file_path.read_text(encoding="ascii")) + 1) + "\n",
        encoding="ascii",
    )
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Schlangenmensch
User
Beiträge: 73
Registriert: Freitag 18. Februar 2022, 10:13

__deets__ hat geschrieben: Donnerstag 31. August 2023, 12:53 Dir ist der Punkt entgangen: du DENKST was du machst ist einfach. So wie es einfach ist, mit nem Schraubenzieher im Starkstromkasten zu hantieren. Aber wehe, wenn’s daneben geht. Eine Datei sicher vor Abstürzen zum falschen Moment zu manipulieren ist schon etwas komplizierter. Machbar, aber am Ende kann man die notwendige Zeit zum lernen von SQLite sinnbringender investieren.

Sorry, aber ich glaube ich wurde falsch verstanden. Ich glaube nicht daß mein Vorhaben daß einfachste ist. Ich wollte damit nur sagen, das ich noch nicht mal annähernd die Basic's kenne und hier noch viel nachholbedarf habe.

Ich weiß ich schreibe manchmal wirres Zeugs, sieht man ja auch an meinen "codeschnipseln" :oops:
Antworten