Python Quellcode in eine txt-Datei umwandeln

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
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

Ich habe eine "*txt" - Datei mit dem Titel "Bestenliste.txt" und dem folgendem einfachen Inhalt: " bestenliste=[[8.0, "Alpha"], [6.0, "Beta"]] "

D.h. "Alpha" bekommt den Wert 8.0 und "Beta" den Wert 6.0 zugewiesen.

Ich habe folgenden einfachen Python Quellcode programmiert:

fobj_in=open("Bestenliste.txt", "r") #diese TEXT-Datei existiert schon
fobj_out=open("bestenliste.py", "w") #diese PYTHON-Datei wird neu erschaffen
counter=0
for line in fobj_in:
counter+=1
out_line=line.rstrip()
fobj_out.write(out_line)

fobj_in.close()
fobj_out.close()
from bestenliste import* #jetzt erst kann von der PYTHON_Datei "bestenliste" etwas importiert werden, weil sie erst jetzt existiert
print(bestenliste) #hier die alte bestenliste: bestenliste=[[8.0, "Alpha"], [6.0, "Beta"]]
Punktezahl=7
X=[]
X.append(float(Punktezahl))
Name=input("Geben Sie Ihren Namen ein! ")
X.append(str(Name))
bestenliste.append(X)
print(bestenliste) #hier kommt die neue bestenliste: [[8.0, 'Alpha'], [6.0, 'Beta'], [7.0, 'Charlie']]
print("Jetzt sortieren wir mal ein bißchen!")

bestenliste_neu=[]
for i in sorted(bestenliste, key=lambda x: x[0]): #diese for-Schleife sortiert AUFSTEIGEND....
bestenliste_neu.append(i) #hier kommt [7.0, 'Charlie']
# [8.0, 'Alpha']
print(bestenliste_neu) #jetzt haben wir die Liste AUFTEIGEND sortiert
bestenliste_neu.reverse() #....deshalb hier alles umdrehen, damit ABSTEIGEND
print(bestenliste_neu) #bis hierhin alles ok: es wurde eine neue Liste in einer Pythondatei erzeugt!


Es wurde also eine neue Python Datei " bestenliste.py " erzeugt, mit folgendem Inhalt: " bestenliste=[[8.0, "Alpha"], [6.0, "Beta"]] "
In der Programmierzeile " Name=input("Geben Sie Ihren Namen ein! ") " soll nun der Name "Charlie" eingegeben werden, der den Wert "7.0" zugewiesen bekommt, und jetzt soll
[7.0, "Charlie"] zur "bestenliste" hinzugefügt werden und anschließend nach den zugewiesenen Werten - absteigend - geordnet werden.

Am Schluss kommt folgende Ausgabe heraus : [[8.0, 'Alpha'], [7.0, 'Charlie'], [6.0, 'Beta']]
Jetzt meine Frage: Ich möchte in der alten txt-Datei "Bestenliste.txt" den alten Inhalt " bestenliste=[[8.0, "Alpha"], [6.0, "Beta"]] " löschen und durch den neuen Inhalt " [[8.0, 'Alpha'], [7.0, 'Charlie'], [6.0, 'Beta']] " ersetzen.

Kann mir bitte jemand diesen Quellcode diesbzgl. vervollständigen?
Nach oben
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

import ist nicht dafür gedacht, Daten zu laden. Statt also so seltsame txt- bzw. py-Dateien zu schreiben, benutze ein passendes Dateiformat, wie z.B. json.
In Python ist alles ein Objekt, eine Variabke fobj zu nennen also nicht sehr aussagekräftig. Zum Sortieren gibt es die sort-Methode.
Benutzeravatar
__blackjack__
User
Beiträge: 13269
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mister_xyz: Es sollte keine Textdatei mit Python-Quelltext existieren. Python-Quelltext ist kein sinnvolles Format um Daten zu speichern. Um verschachtelte Listen zu speichern bietet sich beispielsweise das JSON-Format an. Python hat da ein Modul zum lesen und schreiben von JSON-formatierten Daten in der Standardbibliothek: das `json`-Modul.

Wozu ist `counter` gut? Das wird hochgezählt, aber mit dem Wert wird nie irgend etwas gemacht.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben. Und das muss in Deinem Fall UTF-8 sein. Also die Kodierung die beim öffnen angegeben wird *und* natürlich auch die tatsächliche Kodierung in der Datei. Denn Du importierst das Ergebnis als Modul (was man so wie gesagt nicht macht) und Python erwartet Quelltexte UTF-8 kodiert. JSON ist auch UTF-8 kodiert.

`fobj*` ist kein guter Name. Er enthält eine kryptische, einbuchstabige Abkürzung, und ein nichtssagendes `obj`, was wohl für `object` stehen soll. Nun ist aber jeder Wert in Python ein Objekt, womit dieser Zusatz im Namen an jedem Namen stehen könnte, ohne das er irgend etwas aussagt was man nicht schon wüsste. `input_file` und `output_file` wären beispielsweise Namen die nicht aus kryptischen Abkürzungen zusammengesetzt sind, und dem Leser klar sagen was die Werte bedeuten.

Man muss auch nicht jedes kleine Zwischenergebnis an einen Namen binden. `out_line` könnte man sich beispielsweise sparen.

Du veränderst da übrigend den Dateiinhalt wenn Du „whitespace“-Zeichen an den Zeilenenden beim kopieren einfach entfernst.

`input()` liefert als Ergebnis eine Zeichenkette. Es macht keinen Sinn da noch mal `str()` mit aufzurufen.

`X` ist ein sehr schlechter Name für einen Eintrag in einer Bestenliste. Wobei man auch hier wieder hinterfragen könnte ob man da überhaupt einen eigenen Namen für braucht. Statt da eine leere Liste zu erzeugen und zwei Werte anzuhängen, könnte man auch eine literale Liste mit den zwei Werten einfach hinschreiben. Und dass dann auch gleich in den `append()`-Aufruf auf der Bestenliste.

Es ist auch ein bisschen umständlich eine literale ganze Zahl an einen Namen zu binden, die dann garantiert mit `float()` in eine Gleitkommazahl umgewandelt wird. Da könnte man auch gleich die Zahl als Gleitkommazahl in den Quelltext schreiben.

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

Das mit dem sortieren ist extrem umständlich gelöst. `sorted()` liefert doch bereits eine sortierte Liste. Die dann elementweise an eine leere Liste anhängen macht keinen Sinn wenn man sie doch einfach direkt verwenden kann.

`i` ist dann mal ein einbuchstabiger Name der tatsächlich verwendbar ist. Allerdings für ganze Zahlen die als Index verwendet werden. Nicht für andere, komplexere Werte wie Listen.

Das `key`-Argument braucht man nicht, denn es wird ohne auch nach dem ersten Element in den Listen sortiert. Es verhält sich geringfügig anders, weil bei Gleichheit des ersten Elements das zweite für den Vergleich hinzugezogen wird, aber das sollte hier nichts ausmachen.

Den `reverse()`-Aufruf kann man sich sparen. Da hat `sorted()` ein Argument für.

Und wenn man nicht zwingend eine sortierte Kopie benötigt, könnte man auch einfach die ursprüngliche Liste mit der `sort()`-Methode sortieren.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

__blackjack__ hat geschrieben: Montag 18. April 2022, 15:38 @mister_xyz: Es sollte keine Textdatei mit Python-Quelltext existieren. Python-Quelltext ist kein sinnvolles Format um Daten zu speichern. Um verschachtelte Listen zu speichern bietet sich beispielsweise das JSON-Format an. Python hat da ein Modul zum lesen und schreiben von JSON-formatierten Daten in der Standardbibliothek: das `json`-Modul.

Wozu ist `counter` gut? Das wird hochgezählt, aber mit dem Wert wird nie irgend etwas gemacht.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben. Und das muss in Deinem Fall UTF-8 sein. Also die Kodierung die beim öffnen angegeben wird *und* natürlich auch die tatsächliche Kodierung in der Datei. Denn Du importierst das Ergebnis als Modul (was man so wie gesagt nicht macht) und Python erwartet Quelltexte UTF-8 kodiert. JSON ist auch UTF-8 kodiert.

`fobj*` ist kein guter Name. Er enthält eine kryptische, einbuchstabige Abkürzung, und ein nichtssagendes `obj`, was wohl für `object` stehen soll. Nun ist aber jeder Wert in Python ein Objekt, womit dieser Zusatz im Namen an jedem Namen stehen könnte, ohne das er irgend etwas aussagt was man nicht schon wüsste. `input_file` und `output_file` wären beispielsweise Namen die nicht aus kryptischen Abkürzungen zusammengesetzt sind, und dem Leser klar sagen was die Werte bedeuten.

Man muss auch nicht jedes kleine Zwischenergebnis an einen Namen binden. `out_line` könnte man sich beispielsweise sparen.

Du veränderst da übrigend den Dateiinhalt wenn Du „whitespace“-Zeichen an den Zeilenenden beim kopieren einfach entfernst.

`input()` liefert als Ergebnis eine Zeichenkette. Es macht keinen Sinn da noch mal `str()` mit aufzurufen.

`X` ist ein sehr schlechter Name für einen Eintrag in einer Bestenliste. Wobei man auch hier wieder hinterfragen könnte ob man da überhaupt einen eigenen Namen für braucht. Statt da eine leere Liste zu erzeugen und zwei Werte anzuhängen, könnte man auch eine literale Liste mit den zwei Werten einfach hinschreiben. Und dass dann auch gleich in den `append()`-Aufruf auf der Bestenliste.

Es ist auch ein bisschen umständlich eine literale ganze Zahl an einen Namen zu binden, die dann garantiert mit `float()` in eine Gleitkommazahl umgewandelt wird. Da könnte man auch gleich die Zahl als Gleitkommazahl in den Quelltext schreiben.

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

Das mit dem sortieren ist extrem umständlich gelöst. `sorted()` liefert doch bereits eine sortierte Liste. Die dann elementweise an eine leere Liste anhängen macht keinen Sinn wenn man sie doch einfach direkt verwenden kann.

`i` ist dann mal ein einbuchstabiger Name der tatsächlich verwendbar ist. Allerdings für ganze Zahlen die als Index verwendet werden. Nicht für andere, komplexere Werte wie Listen.

Das `key`-Argument braucht man nicht, denn es wird ohne auch nach dem ersten Element in den Listen sortiert. Es verhält sich geringfügig anders, weil bei Gleichheit des ersten Elements das zweite für den Vergleich hinzugezogen wird, aber das sollte hier nichts ausmachen.

Den `reverse()`-Aufruf kann man sich sparen. Da hat `sorted()` ein Argument für.

Und wenn man nicht zwingend eine sortierte Kopie benötigt, könnte man auch einfach die ursprüngliche Liste mit der `sort()`-Methode sortieren.
Wieso müsst ihr so kryptisch antworten? Ich bin bestimmt kein guter Programmierer, aber das was ich bisher programmiert habe tut das was es soll und insofern ist es bis jetzt ok. Ganz abstrakt: Ich habe eine Liste " bestenliste=[[8.0, "Alpha"], [6.0, "Beta"]] " in einer txt-Datei, und habe die Besteliste in eine neue, sortierte überführt, nämlich......................................... [[8.0, 'Alpha'], [7.0, 'Charlie'], [6.0, 'Beta']].................und will jetzt, dass die alte Liste in der Txt-Datei gelöscht und durch die neue ersetzt wird. Kann mir bitte ab da jemand helfen? Ob das bis dahin ok oder weniger ok programmiert wurde ist nicht relevant! Es tut das was es tun soll (bis dahin)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bis jetzt war es ganz ok. Und jetzt hast du ein Problem, und wir sagen dir: deine anvisierte Loesung ist eben nicht ganz ok. Sondern richtig schlecht.

Die stilistischen Anmerkungen von __blackjack__ kannst du sehen wie du willst, aber seine Anmerkung zum JSON-Format ist der entscheidende Hinweis. Zum speichern und laden von Datenstrukturen benutzt man eine solche Technologie, und missbraucht nicht den import-Mechanismus von Python. Oder faengt sich ein riesen Sicherheitsloch ein, weil sich einer deiner Mitspieler "import shutil; shutil.rmtree('/')" nennt, und ploetzlich ist deine Festplatte leer.

Zu guter Letzt: bitte nicht den kompletten Text der Nachricht davor zitieren. Der steht gut sichtbar da schon.
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

Worum es mir eigentlich geht ist folgendes: Ich habe ein Pythonspiel selbst programmiert - und es geht hier NICHT um irgendwelche Sicherheitsfragen. Relativ am Ende des Programms kommt eine Variable "trefferrate", der bereits ein Zahlenwert zugesprochen wird. Z.B. die trefferrate=9, d.h. während des Spiels hat man 9 Punkte erzielt. Jetzt will ich, dass diesen 9 Punkten ein Name (seitens des Spielers) zugesprochen wird. Z.B. "9.0, Peter", also Peter hat 9 Punkte erzielt. Diese "9.0, Peter" soll dann in eine Liste und mit den dortigen verglichen werden. Z.B. "10.0, Anna" und "8.0 Hans" , so dass "9.0, Peter" eingefügt und geordnet wird, so dass folgendes Ergebnis herauskommt:
["10.0, Anna" , "9.0, Peter" , "8.0 Hans"]
Es soll also alles in eine Scoreliste übergeführt werden. Stil ist hier egal, weil es hier wirklich nicht um sicherheitsrelevante Fragen geht, sondern um ein einfaches Computerspiel, wo man Punkte sammelt und dann sich in die Scoreliste eintragen kann.
Bis jetzt ist die Scoreliste eine " *.txt ". Eure stilistischen Aussagen helfen mir nicht weiter. Ich bin bestimmt kein guter Python Programmierer - ES MUSS NUR FUNKTIONIEREN!!
Also: Kann mir jemand mit einem Quellcode helfen eine Bestenliste zu erstellen. Bitte!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was an "dazu benutzt man JSON" ist dir unklar? Hast du das probiert? Das ist dir ja schon mal gesagt worden vor einigen Tagen. Warum hast du das nicht probiert? Hast du in die json-Modul-Dokumentation geschaut? Was an den diversen Beispielen darin ist dir nicht klar?

Deine Score-Repraesentation da oben ist uebrigen grosser Mist. Sie ist inkonsisten (da fehlt bei Hans ein Komma), und sie erlaubt nicht, dass man einfach neuen Scores hinzufuegt. Weil sie alles in einen String manscht, und dann ist keine einfache Sortierung mehr moeglich. Macht man also nicht, sondern speichert das zB als Liste von Tupeln, bzw. Liste von Listen mit zwei Elementen, weil das JSON nur so einlesen kann.

Code: Alles auswählen

highscores = [
  [10, "Anna"],
  [9, "Peter"],
  [8, "Hans"],
]

highscores.append([9.3, "Karl"])
highscores.sort(reverse=True) # und schon ist alles in Ordnung. Geht bei dir nicht. 
Dann noch ein Rat: als jemand, der offensichtlich kaum Ahnung davon hat, Leuten, bei denen sich das anders verhaelt (weswegen du ja hier mit deinen Frage aufkreuzt) zu erzaehlen, was wichtig und was nicht so wichtig ist, ist ziemlich anmassend. Und kontraproduktiv. Ignorier es wenn es dir egal ist, aber dieses "laber mich nicht voll, gib mir Code" das du hier von dir gibst, fuehrt zu allem moeglichen. Aber bestimmt nicht, dass man dir lieber Hilfe angedeihen laesst.
Benutzeravatar
sparrow
User
Beiträge: 4245
Registriert: Freitag 17. April 2009, 10:28

@mister_xyz: Ich habe doch gestern schon in einem anderen Thread auf das offizielle Tutorial verwiesen. Und auch dort sind wir zu dem Ergebnis gekommen, dass das korrekte Vorgehen ist: Die Daten als JSON in einer Datei zu speichern.
Dein Vorgehen mit dem import ist also falsch, dafür ist import nicht da. Das hat nichts damit zu tun, ob du ein erfahrener oder unerfahrener Python-Programmierer bist.
Erfahrung sammelt man durch Lernen und Machen. Also, was spricht dagegen erfahrener zu werden, indem du dir das Tutorual (speziell die Stellen um das Dateien und JSON) mal anschaust und die Lösung erarbeitest?
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

ok, ich habe mitten im Spiel die Trefferrate als Variable "trefferrate":
Was mache ich jetzt?
import json
jetz müßte ein input-Befehl kommen:
Name=input("Gib deinen Namen ein! ")

Ich nehme das mit der txt-Datei zurück: Wie geht es jetzt codemäßig weiter?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist doch jetzt ploetzlich eine ganz andere Aufgabe. Gerade ging es noch um einen Highscore, der auch als Liste vorliegen muss. Jetzt nur noch einen einzigen Namen? Wozu soll der denn gespeichert werden, ohne Score? Fuer die Teilnehmerurkunde?

Und hast du mal *probiert* was zu machen? Wir sagen dir hier, womit es geht. Hast du mal in die Doku geschaut des JSON-Moduls? Was daran ist unklar?

Denn langsam aber sicher sollte doch klar sein, dass wir dir hier keinen fertigen Code vorwerfen. Vor allem etwas, das dermassen trivial ist. Und angeblich
Ich bin bestimmt kein guter Programmierer, aber das was ich bisher programmiert habe tut das was es soll und insofern ist es bis jetzt ok.
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

ok, danke für den Tip mit json, ich habe die Aufgabe jetzt gelöst:

import json, os

Punkte=6

if os.path.exists("Bestenliste.json"): #falls die Datei schon existiert
filename = 'Bestenliste.json'
with open(filename) as file_object:
Highscores = json.load(file_object)
Name=input("Geben Sie Ihren Namen ein! ")
Schachtel=[]
Schachtel.append(Punkte)
Schachtel.append(Name)
Highscores.append(Schachtel)
filename= 'Bestenliste.json'
with open(filename, 'w') as file_object:
json.dump(Highscores, file_object)
Highscores.sort(reverse=True)
with open(filename, 'w') as file_object:
json.dump(Highscores, file_object)

else: #falls die Datei noch nicht existiert
Name=input("Geben Sie Ihren Namen ein! ")
Schachtel=[]
Schachtel.append(Punkte)
Schachtel.append(Name)
Highscores=[] #hier wird eine NEUE Highscoreliste erstellt
Highscores.append(Schachtel)
filename= 'Bestenliste.json'
with open(filename, 'w') as file_object:
json.dump(Highscores, file_object)


..............netter wäre es aber gewesen, wenn Ihr mir das programmiert hättet
nezzcarth
User
Beiträge: 1651
Registriert: Samstag 16. April 2011, 12:47

mister_xyz hat geschrieben: Dienstag 19. April 2022, 18:37 netter wäre es aber gewesen, wenn Ihr mir das programmiert hättet
Schade, dass du das so siehst. Denn eigentlich ist "Hilfe zur Selbsthilfe" doch nachhaltiger, finde ich. Python ist, nach meiner Einschätzung, für den "Hauptsache-es-funktioniert"-Ansatz noch schlechter geeignet als andere Sprachen, da sauberer, gut lesbarer Code, der sich an Konventionen hält, einen noch höheren Stellwert genießt als anderswo. Darauf muss man sich, finde ich, einlassen, wenn man längerfristig Freude an Python haben möchte.
Zuletzt geändert von nezzcarth am Dienstag 19. April 2022, 18:49, insgesamt 1-mal geändert.
mister_xyz
User
Beiträge: 21
Registriert: Freitag 6. Oktober 2017, 18:59

wie findest du denn meinen Code, bzw. meine Lösung?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

mister_xyz hat geschrieben: Dienstag 19. April 2022, 18:37 ..............netter wäre es aber gewesen, wenn Ihr mir das programmiert hättet
Weißt du was total nett wäre? Wenn du bei mir mal die Wohnung putzt. Dann muss ich das nicht selbst machen.

Oder wenn du meine Einkäufe erledigst. Oder meine Post abholst. Und und und. Es gibt so alle möglichen Dinge, die total nett wären. Aber irgendwie muss man die doch selbst erledigen. Alles sehr ungerecht.

Vielleicht machst du das ja die ganze Zeit. Anderen umsonst helfen. Wenn du das beweisen kannst, programmiere ich dir auch deinen Kram hier.

Aber solange dem nicht so ist, wirst du damit leben müssen, dass ich dir in der Wüste den Weg zur nächsten Oase zeige. Statt dir das Wasser anzuschleppen. Aber auch statt dich ahnungslos verdursten zu lassen. Das ist nämlich auch eine substantielle Hilfestellung. Nur den Arsch bewegen muss man selbst, statt selbstgerecht zu erwarten, er würde einem hinterhergetragen werden. Das machen hoffentlich noch nicht mal deine Eltern. Falls doch, erklärt das allerdings so einiges.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum nennst Du das Tuple aus Punkte und Name Schschtel?
Mal benutzt Du Bestenliste.json direkt, mal definierst Du dafür eine Variable. Das ist inkonsitent und beides nicht die beste Lösung. Am besten definiert man dafür einmal eine Konstante.
Variabennamen in Python schreibt man nach Konvention komplett klein.
Eine Liste mit einer fixen Anzahl an Elementen erzeugt man direkt und nicht per append. Doppelten Code vermeidet man.
Und ich poste hier Code, damit Du Deine Lösung mit meiner vergleichen kannst, um daraus was zu lernen. Deshalb genau lesen und die Unterschiede verstehen.

Code: Alles auswählen

import json
import os
HIGHSCORE_FILENAME = "bestenliste.json"

punkte=6
name = input("Geben Sie Ihren Namen ein! ")
entry = [punkte, name]

if os.path.exists(HIGHSCORE_FILENAME):      #falls die Datei schon existiert
    with open(HIGHSCORE_FILENAME, 'rb') as file:
        highscores = json.load(file)
else:
    highscores = []

highscores.append(entry)
highscores.sort(reverse=True)
with open(HIGHSCORE_FILENAME, 'wb') as file:
    json.dump(highscores, file)
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

@Sirius3,

IMHO hat dein Programm zwei kleine Schönheitsfehler.
1.) da der Benutzername ein String ist muss er entweder zu Byte Konvertiert werden, oder du öffnest die JSON Datei nicht als Binary, ansonsten gibt es eine Exception beim Schreiben.
2.) auch wenn der Code für einen Anfänger ist, os.path.exists ist "Look before you leap" das sollte man nicht machen, sondern besser den "Easier to ask for forgiveness than permission" von Grace Hopper wählen und die Exception fangen wenn die Datei nicht existiert. Exceptions in Python sind billig und theoretisch könnte ein anderer Prozess die Datei zwischen den os.path.exists und den open gelöscht haben, sodass man generell ein Exception Handling braucht.

Code: Alles auswählen

import json
import os
HIGHSCORE_FILENAME = "bestenliste.json"

punkte=6
name = input("Geben Sie Ihren Namen ein! ")
entry = [punkte, name]

try:
    with open(HIGHSCORE_FILENAME, 'r', encoding="utf8") as file:
        highscores = json.load(file)
except (FileNotFoundError, IOError, json.decoder.JSONDecodeError):
    highscores = []

highscores.append(entry)
highscores.sort(reverse=True)
print(highscores)

with open(HIGHSCORE_FILENAME, 'w', encoding="utf8") as file:
    json.dump(highscores, file)
Benutzeravatar
__blackjack__
User
Beiträge: 13269
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@imonbln: Ad 1.) Da machst Du es jetzt etwas umständlicher obwohl da gar kein Fehler war. Ich öffne JSON in der Regel auch als Binärdatei weil sich dann `json.load()`/`json.dump()` um alles weitere wie Kodierungen kümmert. Da muss man nichts selbst kodieren.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

__blackjack__ hat geschrieben: Mittwoch 20. April 2022, 12:13 @imonbln: Ad 1.) Da machst Du es jetzt etwas umständlicher obwohl da gar kein Fehler war. Ich öffne JSON in der Regel auch als Binärdatei weil sich dann `json.load()`/`json.dump()` um alles weitere wie Kodierungen kümmert. Da muss man nichts selbst kodieren.
Okay, spannend, was mache ich dann falsch?

Code: Alles auswählen

[imonbln@host new]$ ls -lah
insgesamt 12K 
drwxr-xr-x  2 imonbln imonbln 4,0K 20. Apr 13:29 .
drwxr-xr-x 12 imonbln imonbln 4,0K 20. Apr 13:28 ..
-rw-r--r--  1 imonbln imonbln  462 20. Apr 13:29 bla.py

[imonbln@host new]$ cat bla.py
import json
import os
HIGHSCORE_FILENAME = "bestenliste.json"

punkte=6
name = input("Geben Sie Ihren Namen ein! ")
entry = [punkte, name]

if os.path.exists(HIGHSCORE_FILENAME):      #falls die Datei schon existiert
    with open(HIGHSCORE_FILENAME, 'rb') as file:
        highscores = json.load(file)
else:
    highscores = []

highscores.append(entry)
highscores.sort(reverse=True)
with open(HIGHSCORE_FILENAME, 'wb') as file:
    json.dump(highscores, file)

[imonbln@host new]$ python --version
Python 3.10.4

[imonbln@host new]$ python bla.py
Geben Sie Ihren Namen ein! foo 
Traceback (most recent call last):
  File "/tmp/new/bla.py", line 18, in <module>
    json.dump(highscores, file)
  File "/usr/lib/python3.10/json/__init__.py", line 180, in dump
    fp.write(chunk)
TypeError: a bytes-like object is required, not 'str
Benutzeravatar
__blackjack__
User
Beiträge: 13269
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Okay, es funktioniert anscheinend nur beim lesen. Inkonsistente API würde ich sagen. ☹️
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

__blackjack__ hat geschrieben: Mittwoch 20. April 2022, 15:47 Okay, es funktioniert anscheinend nur beim lesen. Inkonsistente API würde ich sagen. ☹️
So sieht's leider aus, siehe unter [1] / "Basic Usage" / "json.dump(...)": "The json module always produces str objects, not bytes objects. Therefore, fp.write() must support str input."

[1] https://docs.python.org/3/library/json.html
Antworten