Seite 1 von 1

Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 12:08
von cool_brick24
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

Re: Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 12:27
von ThomasL
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

Re: Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 12:39
von cool_brick24
Danke!

Re: Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 12:47
von cool_brick24
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

Re: Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 13:01
von ThomasL
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?

Re: Python | Datei wird überschrieben

Verfasst: Samstag 26. Januar 2019, 13:18
von __blackjack__
@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()