Python | Datei wird überschrieben

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
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Hallo liebes Forum,

Ich möchte die Wörter eines Inputs in eine Datei reinschreiben. Python überschreibt diese Datei aber einfach...
Mein Code sieht bisher so aus:

Code: Alles auswählen

def sendPlayerMessage():
     global messageTiles
     playerMessage = input("Message: ")
     
     messageTiles = playerMessage.split()
     messageTilesLen = len(messageTiles)

     messages = open("data\chat.data", "w")
     for i in range(0, messageTilesLen):
          messages.write(str(messageTiles[i].split(' ')))

     messages.write("\n")
     messages.close()     


while True:
     sendPlayerMessage()
Bsp: Die 1. Eingabe: A B C D
Die 2. EIngabe: 1 2 3 4
In der Datei steht dann nur noch "1 2 3 4"

Ich hoffe ihr könnt mir weiterhelfen. Benutze Python 3.7
MfG
Ari
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wenn du eine Datei mit "w" öffnest, wird eine bereits bestehende Datei gleichen Namens gelöscht und eine neue angelegt.
Wenn du Daten anhängen willst, musst du den Parameter "a" verwenden.
https://docs.python.org/3/library/functions.html#open
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Danke!
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Eine kleine Frage noch: Ist es möglich den input zu verstecken, also wenn ich jetzt in den Input komme, und einen Text wie z.B. Hallo sende steht in der Konsole:

Code: Alles auswählen

Message: Hallo
['Hallo']
Ich möchte einfach nur dieses "Message: Hallo" verstecken, dass da nur noch:

Code: Alles auswählen

 Hallo 
steht.

Ich hoffe ich konnte es soweit gut erklären.
MfG
Ari
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das "Message: " verschwindet, wenn du playerMessage = input() nimmst, anstelle von playerMessage = input("Message: ")
Das ['Hallo'] erscheint ja wohl, weil du den eingegebenen Text nochmals ausgibst, oder?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cool_brick24: Anmerkungen zum Quelltext: Eingerückt wird mit vier Leerzeichen pro Ebene, nicht fünf.

Namen schreibt man in Python klein_mit_unterstrichen. Ausgenommen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `sendPlayerMessage()` müsste also `send_player_message()` heissen.

Vergiss sofort wieder dass es ``global`` gibt. Das hat in einem ordentlichen Programm nichts zu suchen. Wenn eine Funktion oder Methode ein Ergebnis hat, dann gibt man das mit ``return`` an den Aufrufer zurück und nicht über schwer nachvollziebare globale Variablen.

`message_tiles_len` ist überflüssig weil das nur einmal verwendet wird. Da kann man dann auch gleich den Ausdruck an der Stelle schreiben.

Wenn Backslashes in Zeichenkettenliteralen vorkommen sollte man die *immer* escapen oder ”rohe” Zeichenkettenliterale verwenden, auch wenn das Zeichen nach dem Backslash keine besondere Bedeutung hat. Bei Pfaden kann man auch unter Windows den normalen Schrägstrich als Pfadtrenner verwenden. Damit umgeht man dieses Problem ganz.

Dateien sollte man wo möglich mit ``with`` verwenden um das Schliessen der Datei in jedem Fall zu garantieren.

Etwas nach dem Muster ``for i in range(0, len(sequence)):`` ist in Python ein „anti pattern“. Man kann in Python *direkt* über die Elemente von Sequenzen iterieren, ohne den Umweg über einen Index.

Was Du da im `write()`-Aufruf machst ist hochgradig unsinnig. Erst einmal führt der `split()`-Aufruf grundsätzlich zu einer Liste mit genau einem Element, denn die Zeichenkette die da an Leerzeichen zerlegt werden soll kann garantiert *kein* einziges Leerzeichen enthalten weil die Zeichenkette ja bereits durch ein `split()` entstanden ist das an Whitespace-Zeichen zerlegt hat.

Das könnte man also abkürzen wenn man einfach eine literale Liste mit der Zeichenkette als einzigem Element hinschreiben würde. Nur machen Listen mit grundsätzlich immer nur einem Element keinen Sinn. Was soll das?

Der nächste Fehler ist dann eine Zeichenkettenrepräsentation einer Python-Liste in eine Datei zu schreiben. Das ist in 99,99% der Fälle nicht das was man machen möchte. Warum machst Du das? Welchen Sinn hat das?

Wenn ich mal raten müsste, möchtest Du in der Datei eine Zeile pro Eingabe vom Benutzer. Warum schreibst Du dann nicht einfach die Eingabe des Benutzers in die Datei, so wie Du sie bekommst? Jede weitere Verarbeitung müsste ja irgendwie sinnvoll begründbar sein.

Von der Funktion bleibt letztlich das hier übrig:

Code: Alles auswählen

def send_player_message():
    line = input('Message: ')

    with open('data/chat.data', 'a', encoding='utf-8') as messages_file:
        messages_file.write(line + '\n')
    
    return line.split()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten