2016-12-01 3 views
2

ein anderes Problem, das ich festgestellt habe, habe ich diesen Code, um einen Namen aus einer Textdatei zu entfernen. Ich bin mir nicht ganz sicher, warum, aber manchmal funktioniert es gut und entfernt den Namen, aber oft nicht, gibt es einen besseren Weg, dies zu tun, der 100% der Zeit funktioniert? Ich habe meinen Dateipfad und Dateinamen geändert, da ihr ihn nicht braucht.Entfernen von Namen aus einer Textdatei

with open(r"MyFilePath\MyFile.txt","r") as file: 
     participants=[] 
     for line in file: 
      participants.append(line) 
    file.close() 
    leavingParticipant=input("Enter leaving participant: ") 
    file=open(r"MyFilePath\MyFile.txt","w") 
    for participant in participants: 
     if participant!=leavingParticipant+"\n": 
      file.write(participant) 
    file.close() 
+0

nur mit Blick auf Ihren Code meine beste Vermutung wäre, dass es mit 'leavingParticipant +" \ n "' ... könnte Sie einige Beispieldaten einfügen? – anshanno

Antwort

2
with open(r"MyFilePath\MyFile.txt","r") as file: 
    participants=[] 
    for line in file: 
     participants.append(line) 

leavingParticipant=input("Enter leaving participant: ") 

with open(r"MyFilePath\MyFile.txt","w") as file: 
    for participant in participants: 
     if leavingParticipant != participant.strip(): 
      file.write(participant) 

Sie müssen nicht manuell schließen Dateien in Zusammenhang Manager (Die with..as Aussagen). Anstatt zu versuchen, mit dem Leerraum um die Informationen herum zu spielen, die wir brauchen, lassen Sie uns das einfach für unseren Vergleich entfernen.

+0

danke, arbeitete eine Belohnung, ohne viel von dem, was ich getan hatte, zu ändern – WhatsThePoint

2

Erstens brauchen Sie nicht die Zeilen zu lesen und sie zu einer Liste anhängen manuell, weil, wenn Sie Ihre Datei öffnen die open() Funktion gibt ein Dateiobjekt, das ein Iterator artig ist Objekt alle Zeilen enthält. Oder wenn Sie sie zwischenspeichern möchten, können Sie readlines() Methode verwenden.

Zweitens müssen Sie die Datei nicht schließen, wenn Sie with Anweisung verwenden, das ist genau einer seiner Jobs, die die Dateien am Ende des Blocks schließen.

Mit den oben genannten Anmerkungen haben Sie einige Optionen, um dies zu tun, die am besten ein temporäres Dateiobjekt zum Lesen und Ändern der Datei auf einmal verwendet. Zum Glück bietet Python uns tempfile Modul und Sie können NamedTemporaryFile Methode in diesem Fall verwenden. Und verwenden Sie shutil.move(), um die temporäre Datei durch die aktuelle Datei zu ersetzen.

import tempfile 
import shutil 

leavingParticipant=input("Enter leaving participant: ") 
filename = 'filename' 
with open(filename, 'rb') as inp, tempfile.NamedTemporaryFile(mode='wb', delete=False) as out: 
    for line if inp: 
     if line != leavingParticipant: 
      put.write(line) 


shutil.move(out.name, filename) 
0

Lassen Sie uns etwas von Ihrem Code neu schreiben. Zuerst ist file ein reserviertes Wort, daher ist es am besten, es nicht zu überladen. Zweitens, da Sie with verwenden, um die Datei zu öffnen, müssen Sie .close() nicht verwenden. Dies geschieht automatisch, wenn die Klausel with endet. Sie müssen nicht über die Teilnehmerliste iterieren. Es gibt mehrere Möglichkeiten, ein Element aus einer Liste zu entfernen. Die Verwendung von .remove(item) ist wahrscheinlich am besten geeignet.

+1

@Patrick: das ist falsch. Mit 'in' wird nach einer genauen Übereinstimmung innerhalb der String-Liste gesucht. Es wird die Suche nicht innerhalb jeder Zeichenfolge in der Liste zugeordnet. – James

Verwandte Themen