2017-03-02 3 views
0

Ich versuche, eine Benutzerliste in einer Datei auf einem Netzlaufwerk zu speichern und möchte, dass der Name aus der Textdatei entfernt wird, wenn der Benutzer das Programm beendet. Wenn ich es ausführe, wird nur der letzte Name in der Liste in der Datei gespeichert. Hier ist, was ichSo speichern Sie den Inhalt der gefilterten Liste im Textdokument

def move_offline(self): 
    with open("usercheck.txt", "r") as self.text, open("user.txt", "r") as exc: 
     exclusions = [line.rstrip('\n') for line in exc] 
     for line in self.text: 
      if not any(exclusion in line for exclusion in exclusions): 
       #print (line) 
       self.gg = [line.strip("\n")] 
       print (self.gg) 

Diese Funktion versucht habe, nur um festzustellen, was der Benutzername ist und wenn es in der Datei auf der Netzwerkdatei

def actmov(self): 
    try: 
     mmm = open("usercheck.txt","w") 
     mmm.writelines(["%s\n"%item for item in self.gg]) 
    except AttributeError: 
     print ("Oops, something didnt save correctly!") 

vorhanden ist Wenn Sie eine elegantere Lösung, die ist völlig anders als der hier gezeigte Ansatz Ich wäre mehr als glücklich, sie zu sehen!

+0

@ Jean-FrançoisFabre Die actmov-Funktion wird nur einmal ausgeführt, wenn ich das Programm schließe –

Antwort

1
self.gg = [line.strip("\n")] 

Dies ist Ihr Problem. Jede Iteration, die Sie self.gg auf die One-Element-Liste setzen, die aus line.strip("\n") besteht. Stattdessen sollten Sie self.gg irgendwo während der Initialisierung (oder vielleicht zu Beginn Ihrer Funktion) auf eine leere Liste setzen und dann stattdessen self.gg.append(line.strip("\n")) tun.

+0

Danke für die Erklärung! Funktioniert perfekt –

+0

Sie könnten auch den hässlichsten Einzeiler verwenden, den ich in letzter Zeit geschrieben habe: 'self.gg = [line.strip (" \ n ") für Zeile in open (" usercheck.txt ") wenn nicht (exc in line für exc in map (str.rstrip, öffnen ("user.txt", "r")))] ' –

+0

Danke für den Vorschlag haha. Ich denke, ich würde den Überblick verlieren, was alles tut. –

1

Problem ist, dass man mit nur einem Element eine self.gg Liste Gebäude sind:

self.gg = [line.strip("\n")] 

beiseite:

  • mmm.writelines(["%s\n"%item for item in self.gg])mmm.writelines("{}\n".format(item) for item in self.gg) sein könnte, keine Notwendigkeit, eine Liste zu erstellen, geben Sie einfach die gencomp to writelines
  • erwarten große Leistungssteigerung in der Suche durch Erstellen eines Satzes Verständnis für Ausschlüsse (wenn es viele Benutzer sind): exclusions = {line.rstrip('\n') for line in exc}
  • Sie könnten auch entscheiden rstrip vollständig überall zu fallen, Sie etwas mehr Verarbeitung mit dem gleichen Ergebnis vermeiden konnte (direkt die Liste von Strings verwenden, anstatt einen gestrippt ein zu bauen und Dumping es Hinzufügen der Zeilenvorschub zurück)
+0

RE: pitcht listcomp vs genexp, ich würde lieber sehen eine Änderung von '" formatieren% s diese "%" wie "' '' '' Formatierung {} this ".format (" like ")' . So oder so, aber .... –

+0

ja Format ist der Weg. Bearbeitung. –

Verwandte Themen