Seite 1 von 1

verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 13:16
von Count
Hi,

ich möchte in eine Datei schreiben, wenn eine Bedingung erfüllt ist, mit variierendem Input.
wie mache ich das?

Habe noch nicht viel Erfahrung mit Python.

hier was ich mir gedacht habe:

Code: Alles auswählen

hosts='C:/Users/Username/Desktop/test/testhosts.txt'

def test():
    file = open(hosts,'a')
    file.write('\n')
    file.write(x)			#hier fehlt bestimmt was, oder muss komplett anders sein, da man keine Funktion hier eintragen kann
    file.close()

def x() ?					#wie definieren, wenn überhaupt?
	?

def sperren_action():
    if (var1.get() == (1)):
        test()
        x=('127.0.0.1 www.amazon.com')
    if (var2.get() == (1)):
         test()
        x=('127.0.0.1 www.twitter.com')
 
Danke für Antworten im Voraus.

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 14:09
von __deets__
Die Klammern um deine Strings und if-Bedingungen sind ueberfluessig und erschweren das lesen nur unnoetig. Auch (1) ist unnoetig, und ein einfaches

Code: Alles auswählen

if var2.get():


solte reichen.

Und wenn du moechtest, das eine Datei geschrieben wird in einer Funktion mit veraenderlichen Inhalten, dann musst du die einfach per Parameter uebergeben.

Code: Alles auswählen

def schreibe_hosts(eintrag):
      with open(hosts, 'a') as outf:
            outf.write('{}\n'.format(eintrag))
Und dann natuerlich auch an der Stelle wo du deine varX auswertest entsprechend aufrufen.

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 14:12
von Count
Danke für die Antwort
werde die Klammern entfernen^^

hab aber für mein Problem nun folgende Lösung, durch mal weg vom Rechner gehen und wieder ransetzen, gefunden
gleih Code mit deinem Hinweis angepasst

Code: Alles auswählen

def sperr(x):
            file = open(hosts,'a')
            file.write('\n')
            file.write(x)
            file.close()

        def sperren_action():
            if var1.get():
                sperr('127.0.0.1 www.amazon.com')

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 14:13
von __deets__
Geht in die richgtige Richtung, aber ich benutze das with-Statement, und das solltest du auch. Das erledigt das schliessen fuer dich gleich mit.

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 14:15
von Count
werde mal schauen was das so macht und ob ich damit klar komme, danke

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Donnerstag 28. November 2019, 14:46
von Sirius3
Sowohl ` hosts` als auch `var1` kommen aus dem Nichts. Das sollte nicht sein, alles was eine Funktion braucht, muß sie auch über ihre Argumente bekommen. Außer Konstanten, die schreibt man aber GROSS. ` var1` ist zudem ein sehr schlechter Variablennamen, ` var` gilt für jede Variable, und 1 ist nur eine Nummer. Variablennamen müssen aussagekräftig sein.

Code: Alles auswählen

HOSTS_FILENAME = 'C:/Users/Username/Desktop/test/testhosts.txt'
def sperren(hostname):
    with open(HOSTS_FILENAME , 'a') as output:
        output.write(f"127.0.0.1 {hostname}\n")

def sperren_action(amazon_sperren):
    if amazon_sperren.get():
        sperren("www.amazon.com")
Die anderen Teile des Programms mußt Du natürlich noch anpassen.

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Montag 2. Dezember 2019, 09:13
von Count
@Sirius3
da kommt nichts aus dem Nichts^^
ist ja nur der Teil um den es mir ging und nicht das komplette Ding

Aber ja das mit var1 -bis varx ist wirklich nicht elegant

Re: verschiedene Argumente mit gleichem Befehl in file schreiben

Verfasst: Montag 2. Dezember 2019, 10:18
von /me
Count hat geschrieben: Montag 2. Dezember 2019, 09:13 da kommt nichts aus dem Nichts^^
ist ja nur der Teil um den es mir ging und nicht das komplette Ding
Nehmen wir an, dein Code sähe vom Prinzip her so aus.

Code: Alles auswählen

def sperren_action():
    if var1.get():
        sperren('127.0.0.1 www.amazon.com')

var1 = ...wasauchimmer...
sperren_action()
Das ist dann immer noch ein "aus dem Nichts". Genauer gesagt kommt var1 in der Funktion dann aus dem globalen Namensraum und das ist schlecht. Die Funktion ist dadurch mit ihrer Verarbeitung genau an die konkrete Umgebung gebunden. Alles was eine Funktion benötigt sollte sie über ihre Parameter erhalten und alles was sie gegebenenfalls bereitstellt über ein return-Statement zurückgeben. Du erreichst dadurch viel mehr Flexibilität und handliche einzeln testbare Prozeduren.

Mal abgesehen von den Namen wäre dann das Folgende der richtige Ansatz.

Code: Alles auswählen

def sperren_action(feld):
    if feld.get():
        sperren('127.0.0.1 www.amazon.com')

var1 = ...wasauchimmer...
sperren_action(var1)