Seite 1 von 1

Mehrere String in file.write()

Verfasst: Freitag 4. August 2017, 20:34
von GuardDog
Hallo liebe Community,

ich habe folgendes Problem: ich möchte in eine Zeile einer .txt Datei den Inhalt von 3 Variablen, zwei darunter sind "Input"-Funktionen, schreiben.

Mein Code:

Code: Alles auswählen

setint_name = input("Name der Variable:")
setint_val = input("Wert der Variable:")
file_code.write(setint_name,"=",setint_val, ";")
Mein Fehler:

Code: Alles auswählen

TypeError: write() takes exactly one argument (4 given)
Ich hoffe, ihr könnt mir helfen :?

Re: Mehrere String in file.write()

Verfasst: Freitag 4. August 2017, 20:54
von BlackJack
@GuardDog: Du machst da einfach mit Zeichenkettenformatierung *eine* Zeichenkette draus. Und vergiss das Zeilenende-Zeichen nicht, damit es wirklich eine Zeile in der Datei wird.

Re: Mehrere String in file.write()

Verfasst: Freitag 4. August 2017, 20:56
von GuardDog
Uuund das geht wie? Sorry :mrgreen:

Re: Mehrere String in file.write()

Verfasst: Freitag 4. August 2017, 21:25
von BlackJack
@GuardDog: Mit der entsprechenden Methode auf Zeichenketten. Sollte im Tutorial in der Python-Dokumentation stehen.

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 07:13
von snafu
Wenn du die Form mit den Kommas beibehalten möchtest, dann nimm print() zum Schreiben:

Code: Alles auswählen

with open('datei.txt', 'w') as outfile:
    print(setint_name,"=",setint_val, ";", file=outfile)
Ansonsten halt mit String Formatting:

Code: Alles auswählen

outfile.write('{}={};'.format(setint_name, setint_value))

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 08:34
von BlackJack
@snafu: Du hast das '\n' im zweiten Beispiel vergessen. :-)

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 13:35
von GuardDog
Also praktisch:

Code: Alles auswählen

file_code.write('{}={};'.format(setint_name, "=", setint_value, ";"))
EDIT:

ich bekomme keinen Fehler mehr, aber es wird nichts in die datei geschriben :?

Code: Alles auswählen

  setint_name = input("Name der Variable:")
setint_val = input("Wert der Variable:")
file_code.write('{}={};'.format(setint_name, "=", setint_val, ";"))

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 14:44
von BlackJack
@GuardDog: Doch, es wird etwas in die Datei geschrieben. Allerdings nicht das Richtige, denn Du hast mehr Werte als Platzhalter, und es fehlt IMHO immer noch ein Zeilenende-Zeichen. Und man sieht es in der Datei erst wenn sie geschlossen oder zumindest ge”flush()”ed wurde.

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 14:57
von GuardDog
BlackJack hat geschrieben:@GuardDog: Doch, es wird etwas in die Datei geschrieben. Allerdings nicht das Richtige, denn Du hast mehr Werte als Platzhalter, und es fehlt IMHO immer noch ein Zeilenende-Zeichen. Und man sieht es in der Datei erst wenn sie geschlossen oder zumindest ge”flush()”ed wurde.
Mehr Werte als Platzhalter?
Ein Zeilenende Zeichen? In etwa \n?
ge"flush()"ed?

Und funtkioniert:

Code: Alles auswählen

os.system('{}={};'.format("defaults write com.apple.dock springboard-columns -int", entryvar, "&& killall Dock"))
auch?

Kann man ein entry widget in mehrere "columns" bei grid setzen (also praktisch column=1-3)

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 15:43
von snafu
Wenn du dich wenigstens oberflächlich mal mit dem Thema String Formatting beschäftigen würdest (so maximal 5 Minuten), dann wüsstest du, wieso es zu dem Fehler kommt. Du könntest auch ganz stumpf meinen Code kopieren, da dieser fehlerfrei funktionieren wird. Nur das Zeilenende-Zeichen sollte halt noch angefügt werden.

EDIT:
Oder eben print() in der gezeigten Form benutzen. Der wird dir dann nur Leerzeichen reinknallen. Das kannst du beheben, wenn du sep='' als Paramater mitgibst. Und dann kann man im Endeffekt auch gleich String Formatting nehmen.

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 15:51
von GuardDog
snafu hat geschrieben:Wenn du dich wenigstens oberflächlich mal mit dem Thema String Formatting beschäftigen würdest (so maximal 5 Minuten), dann wüsstest du, wieso es zu dem Fehler kommt. Du könntest auch ganz stumpf meinen Code kopieren, da dieser fehlerfrei funktionieren wird. Nur das Zeilenende-Zeichen sollte halt noch angefügt werden.

EDIT:
Oder eben print() in der gezeigten Form benutzen. Der wird dir dann nur Leerzeichen reinknallen. Das kannst du beheben, wenn du sep='' als Paramater mitgibst. Und dann kann man im Endeffekt auch gleich String Formatting nehmen.
Okay jetzt funktionier es danke. Habe noch ein outfile.close() angefügt

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 15:53
von snafu
GuardDog hat geschrieben:Und funtkioniert:

Code: Alles auswählen

os.system('{}={};'.format("defaults write com.apple.dock springboard-columns -int", entryvar, "&& killall Dock"))
auch?
Nein, das wird nicht funktionieren. Da sind zwei Platzhalter (die geschweiften Klammern), aber du übergibst drei Argumente. Zumal deine Benutzung von String Formatting sehr komisch ist. Normalerweise setzt man die Textteile, die bereits feststehen, nicht umständlich ein, sondern man schreibt sie direkt hin. Also so:

Code: Alles auswählen

os.system('defaults write com.apple.dock springboard-columns -int={} && killall Dock'.format(entryvar))
Übrigens ist os.system() veraltet und wurde durch subprocess.call() ersetzt.

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 15:58
von snafu
GuardDog hat geschrieben:Okay jetzt funktionier es danke. Habe noch ein outfile.close() angefügt
Wenn du es mit dem gezeigten with-Schlüsselwort als Block schreibst, dann wird close() automatisch aufgerufen. Du musst es echt nur kopieren und durch das tatsächliche Kommando ersetzen. Warum machst du es so umständlich, wenn du dich scheinbar sowieso nicht näher mit den Hintergründen beschäftigen willst? Wenn ich etwas nur schnell fertig haben möchte, dann würde ich eigene Änderungen doch nur auf das nötigste beschränken und den Rest einfach so stehen lassen.

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 16:06
von GuardDog
Okay, ich habe es nun entfernt. Und können Sie mir sagen wie man es schafft, ohne das der vorhandene Datei-Text entfernt wird? Also es wird nur der letzte Befehl geschrieben.

Mein gesamter Code lautet nun:

Code: Alles auswählen

from tkinter import *
import os
#    __________________
#___/Befhele definieren\_______________________________________
def forward():
    with open('code.txt', 'w') as outfile:
        print("roboter.bank_a.motorRunUnlimited(SH_Motor_1, SH_Direction_Reverse, 50);", file=outfile)
        print("roboter.bank_a.motorRunUnlimited(SH_Motor_2, SH_Direction_Reverse, 50);\n", file=outfile)
def reverse():
    with open('code.txt', 'w') as outfile:
        print("roboter.bank_a.motorRunUnlimited(SH_Motor_1, SH_Direction_Forward, 50);", file=outfile)
        print("roboter.bank_a.motorRunUnlimited(SH_Motor_2, SH_Direction_Forward, 50);\n", file=outfile)
def off():
    with open('code.txt', 'w') as outfile:
        print("roboter.bank_a.motorStop(SH_Motor_1, SH_Next_Action_Brake);")
        print("roboter.bank_a.motorStop(SH_Motor_2, SH_Next_Action_Brake);\n")
def setint():
    setint_name = input("Name der Variable:")
    setint_val = input("Wert der Variable:")
    with open('code.txt', 'w') as outfile:
        print(setint_name, "=", setint_val, ";", file=outfile)
def makeint():
    makeint_name = input("Name der Variable:")
    with open('code.txt', 'w') as outfile:
        print("int",makeint_name,";", file=outfile)
def getVal():
    sensor_name = input("Welcher Sensor soll gelesen Werden?")
    with open('code.txt', 'w') as outfile:
        print(sensor_name,".getVal();", file=outfile)
def define():
    define_name = input("Name der Funktion")
    define_action = input("Was soll definiert werden?")
    with open('code.txt', 'w') as outfile:
        print("#define",define_name,define_action,";", file=outfile)
def delay():
    delay_dur = input("Wie lange soll gewartet werden (ms)?")
    with open('code.txt', 'w') as outfile:
        print("delay(",delay_dur,");", file=outfile)
def ifask():
    ifcon = input("Was soll die Bedingung sein?")
    with open('code.txt', 'w') as outfile:
        print("if(",ifcon,"){", file=outfile)
def endif():
    with open('code.txt', 'w') as outfile:
        print("}", file=outfile)
def whilestart():
    whilecon = input("Was soll die Bedingung sein?")
    with open('code.txt', 'w') as outfile:
        print("while(",whilecon,"){", file=outfile)
def whileend():
    with open('code.txt', 'w') as outfile:
        print("}", file=outfile)
def serialbegin():
    with open('code.txt', 'w') as outfile:
        print("Serial.begin(9600);", file=outfile)
def serialln():
    serial_str = input("What should be printed on the Serial Monitor?:")
    with open('code.txt', 'w') as outfile:
        print('Serial.println("',serial_str,'")', file=outfile)
#    ______________________
#___/root-fesnter erstellen\_______________________________________
root = Tk()
root.title("TexttoArduino")
root.resizable(width=False, height=False)
os.system("clear")
#    ___________________________________
#___/Buttons, Label, Variablen erstellen\__________________________
entry = Entry(root, width=20)
entryvar = entry.get()
lbl_commands = Label(root, text="Befehle:\n")
btn_forward = Button(root, text="Vorwärts bewegen", width=17, command=forward)
btn_reverse = Button(root, text="Ruckwärts bewegen", width=17, command=reverse)
btn_off = Button(root, text="Motoren stoppen", width=17, command=off)
btn_setint = Button(root, text="Variable verändern", width=17, command=setint)
btn_makeint = Button(root, text="Veriable erstellen", width=17, command=makeint)
btn_getval = Button(root, text="Sensorwerte auslesen", width=17, command=getVal)
btn_define = Button(root, text="Befehl definieren", width=17, command=define)
btn_delay = Button(root, text="Warten", width=17, command=delay)
btn_if = Button(root, text="Falls", width=17, command=ifask)
btn_endif = Button(root, text="X", width=17, command=endif)
btn_while = Button(root, text="Wiederholen", width=17, command=whilestart)
btn_endwhile = Button(root, text="X", width=17, command=whileend)
lbl_serial = Label(root, text="Serieller Monitor:\n", width=17)
btn_serialbegin = Button(root, text="SM starten", width=17, command=serialbegin)
btn_serialln = Button(root, text="Text auf SM ausgeben", width=17, command=serialln)
#    __________________________
#___/set the color of the boxes\___________________________________
btn_endif["fg"] = "#F0F0F0"
btn_endwhile["fg"] = "#F0F0F0"
#    ___________________________________
#___/Buttons/Labels auf ein Grid setzten\__________________________
entry.grid(row=1, column=1)
lbl_commands.grid(row=2, column=2)
btn_forward.grid(row=3, column=1, pady=2, padx=2)
btn_reverse.grid(row=3, column=2, pady=2, padx=2)
btn_off.grid(row=3, column=3, pady=2, padx=2)
btn_makeint.grid(row=4, column=1, pady=2, padx=2)
btn_setint.grid(row=4, column=2, pady=2, padx=2)
btn_getval.grid(row=4, column=3, pady=2, padx=2)
btn_define.grid(row=5, column=1, pady=2, padx=2)
btn_delay.grid(row=5, column=2, pady=2, padx=2)
btn_if.grid(row=6, column=1, pady=2, padx=2)
btn_endif.grid(row=6, column=2)
btn_while.grid(row=7, column=1, pady=2, padx=2)
btn_endwhile.grid(row=7, column=2)
lbl_serial.grid(row=8, column=2)
btn_serialbegin.grid(row=9, column=1, pady=2, padx=2)
btn_serialln.grid(row=9, column=2, pady=2, padx=2)
#    _________________________
#___/mainloop für root starten\____________________________________
entry.focus_set()
root.mainloop()

Re: Mehrere String in file.write()

Verfasst: Samstag 5. August 2017, 21:28
von GuardDog
Ich habe mich jetzt mit dem Thema beschäftigt (danke @snaffu :mrgreen: ). Die Antwort auf meine Frage lautet:

Anstatt:

Code: Alles auswählen

with open('code.txt', 'w') as outfile:
Funktioniert:

Code: Alles auswählen

with open('code.txt', 'a') as outfile: