Verwendung von Python zum löschen einer bestimmten Zeile in einer Datei
Sagen wir, ich habe eine text Datei voller Spitznamen. Wie kann ich das löschen einer bestimmten nickname aus dieser Datei mit Python?
- Versuchen
fileinput
wie beschrieben von @j-f-sebastian hier. Es scheint Ihnen zu erlauben, die Arbeit von Zeile zu Zeile, über eine temporäre Datei, die alle mit einem einfachenfor
syntax.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, öffnen Sie die Datei und erhalten Sie alle Ihre Zeilen aus der Datei. Dann öffnen Sie die Datei im write-Modus und schreiben Sie Ihre Zeilen zurück, mit Ausnahme der Zeile, die Sie löschen möchten:
Müssen Sie
strip("\n")
neue-Zeile-Zeichen in den Vergleich, weil, wenn Sie Ihre Datei nicht mit einem newline-Zeichen der letztenline
auch nicht.Lösung dieses Problems mit nur einem einzigen offenen:
Diese Lösung öffnet die Datei im r/w Modus ("r+") und macht Gebrauch von versuchen zum zurücksetzen der f-pointer und truncate entfernen Sie alles nach dem letzten schreiben.
for
Schleife, werden Sie am Ende mit einer teilweise überschriebenen Datei, mit doppelten Zeilen oder eine Zeile zur Hälfte abgeschnitten. Möchten Sie vielleichtf.truncate()
direkt nachf.seek(0)
statt. So, wenn Sie einen Fehler erhalten, werden Sie nur am Ende mit einer unvollständigen Datei. Aber die richtige Lösung (wenn man den Speicherplatz), ist die Ausgabe in eine temporäre Datei und verwenden Sie dannos.replace()
oderpathlib.Path(temp_filename).replace(original_filename)
tauschen Sie es mit dem original, nachdem alles gelungen ist.Die beste und Schnellste option, eher als das speichern alles in einer Liste und neu-öffnen der Datei zu schreiben, ist meiner Meinung nach zu neu-schreiben der Datei an anderer Stelle.
Das ist es! In eine Schleife und eine, die nur Sie tun können, die gleiche Sache. Es wird viel schneller sein.
(output.write(line) for line in input if line!="nickname_to_delete"+"\n")
subprocess.call(['mv', 'newfile.txt', 'yourfile.txt'])
os.replace
(neu in python 3.3 v) wird mehr cross-Plattform als ein system Aufrufmv
.Dies ist ein "fork" von @Lother's Antwort (die ich glaube, die berücksichtigt werden sollten ist die richtige Antwort).
Für eine Datei wie diese:
Diese Gabel von Lother ' s Lösung funktioniert einwandfrei:
Verbesserungen:
with open
, die verwerfen die Verwendung vonf.close()
if/else
für die Bewertung, wenn die Zeichenfolge nicht vorhanden ist, in der aktuellen ZeileDas Problem mit Lesen von Zeilen im ersten Durchgang und änderungen (löschen von bestimmten Zeilen) in dem zweiten pass ist, dass, wenn Sie die Datei-Größen sind riesig, man läuft aus dem RAM. Stattdessen wird ein besserer Ansatz ist, um Zeilen gelesen, eine nach der anderen, und schreiben Sie Sie in eine separate Datei, wodurch diejenigen, die Sie nicht brauchen. Ich habe diesen Ansatz mit Dateien, die so groß wie 12-50 GB und die RAM-Auslastung bleibt nahezu konstant. Nur CPU-Zyklen zeigen die Verarbeitung im Gange ist.
Ich mochte die fileinput-Ansatz wie bereits in dieser Antwort:
Beim löschen einer Zeile aus einer text-Datei (python -)
Sagen zum Beispiel habe ich eine Datei mit Leerzeilen in Sie und ich wollen, entfernen Sie leere Linien, hier ist, wie ich es gelöst:
Wenn Sie Linux verwenden, können Sie versuchen, den folgenden Ansatz.
Angenommen, Sie haben eine Textdatei mit dem Namen
animal.txt
:Löschen Sie die erste Zeile:
dann
Ich denke, wenn Sie das Lesen der Datei in eine Liste, dann tun Sie das können Sie die Liste Durchlaufen, um zu schauen, für den Kurznamen, den Sie loswerden wollen. Sie können es viel effizienter, ohne dass zusätzliche Dateien, aber du musst schreiben das Ergebnis zurück in die Quelldatei.
Hier ist, wie könnte ich dies tun:
Gehe ich davon aus
nicknames.csv
enthält Daten wie:Laden Sie dann die Datei in die Liste:
Nächste, Durchlaufen, um die Liste entsprechend Ihrer Eingaben löschen:
Schließlich schreiben Sie das Ergebnis wieder in eine Datei:
Nicht gut lösen, wenn u eine ganze Datei in den Speicher, ich weiß heutzutage jeder haben Tonnen von Speicher, aber Bedenken Sie, wenn die Datei mehrere GB an logs oder so etwas.
Besseren Weg, es zu kopieren Zeile für Zeile in eine neue Datei, löschen die ersten oder so etwas wie, dass
Im Allgemeinen, Sie können es nicht, Sie haben zu schreiben, ohne die ganze Datei wieder (zumindest ab dem Punkt ändern, an das Ende).
In einigen spezifischen Fällen können Sie tun besser als dieses -
wenn Sie alle Ihre Daten-Elemente die gleiche Länge und in keiner bestimmten Reihenfolge, und Sie wissen, der offset von die, die Sie wollen, um loszuwerden, Sie könnten kopieren Sie die Letzte Sache, über die man zu streichen und kürzen Sie die Datei, bevor Sie das Letzte Element;
oder Sie könnten einfach ein überschreiben der Daten-chunk mit einem "das ist schlecht Daten, überspringen Sie es" Wert, oder halten Sie a 'dieser Artikel wurde gelöscht" - flag in Ihre gespeicherten Daten-Elemente, die Sie Kennzeichnen können gelöscht werden, ohne sonst ändern die Datei.
Dies ist wahrscheinlich overkill für kurze Dokumente (alles unter 100 KB?).
Wahrscheinlich, Sie haben bereits eine richtige Antwort, aber hier ist meins.
Anstelle der Verwendung einer Liste zu sammeln, die ungefilterten Daten (was
readlines()
Methode funktioniert), benutze ich zwei Dateien. Einer ist für das halten eines wichtigsten Daten und die zweite für die Daten filtern, wenn Sie Sie löschen eine bestimmte Zeichenfolge. Hier ist ein code:Hoffe, Sie finden diese nützlich! 🙂
Speichern Sie die Datei Zeilen in einer Liste, dann entfernen Sie in der Liste die Zeile, die Sie löschen möchten, und schreiben Sie die bleiben, die Zeilen in eine neue Datei
hier ist eine andere Methode zum entfernen einer/einige-Zeile(N) aus einer Datei:
Ich mag diese Methode, mit fileinput und die "inplace" - Verfahren:
Es ist ein bisschen weniger wortreich als die anderen Antworten und ist schnell genug für
Nehmen den Inhalt der Datei, split es von newline in ein Tupel. Dann, Zugriff auf Tupel-line-Nummer, verbinden Sie Ihre Ergebnis-Tupel, und überschreiben Sie die Datei aus.
tuple(f.read().split('\n'))
?? (2) "Zugriff auf Ihre Tupel s line number" und "join Ihre Ergebnis-Tupel" Klang ziemlich geheimnisvoll; eigentlichen Python-code könnte verständlicher sein.