verschiedene Argumente mit gleichem Befehl in file schreiben

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
Count
User
Beiträge: 28
Registriert: Donnerstag 28. November 2019, 12:56

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Count
User
Beiträge: 28
Registriert: Donnerstag 28. November 2019, 12:56

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')
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Geht in die richgtige Richtung, aber ich benutze das with-Statement, und das solltest du auch. Das erledigt das schliessen fuer dich gleich mit.
Count
User
Beiträge: 28
Registriert: Donnerstag 28. November 2019, 12:56

werde mal schauen was das so macht und ob ich damit klar komme, danke
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Count
User
Beiträge: 28
Registriert: Donnerstag 28. November 2019, 12:56

@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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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)
Antworten