Wie lösche ich den Dateiinhalt einer Textdatei in Python?

140

Ich habe eine Textdatei, die ich in Python löschen möchte. Wie mache ich das?

Hick
quelle
Leute, die die Antworten gegeben haben, haben gesagt, dass es nicht möglich ist. Wollen Sie mir also sagen, wie es einfach in Python geht?
Hick

Antworten:

278

In Python:

open('file.txt', 'w').close()

Oder alternativ, wenn Sie bereits eine geöffnete Datei haben:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

In C ++ könnten Sie etwas Ähnliches verwenden.

ondra
quelle
#include<fstream>und dann std::ofstream("file.txt");ungefähr so ​​kurz wie in Python. :)
wilhelmtell
8
Der Grund dafür (sowohl in C ++ als auch in Python) ist, dass beim Öffnen einer Datei zum Schreiben standardmäßig der vorhandene Inhalt abgeschnitten wird. Es ist also wirklich ein Nebeneffekt, und daher würde ich aus Gründen der Klarheit den expliziten Aufruf von truncate () bevorzugen, obwohl dies nicht erforderlich ist.
Rmeador
7
Wenn Sie die Datei mit "r +" geöffnet haben, verwenden Sie "Abschneiden" (0), wenn Sie eine Datei analysiert haben, die Sie wahrscheinlich haben. Fügen Sie dies der obigen Antwort hinzu, um es zu vervollständigen!
Johan Engblom
3
Verwenden Sie f.seek (0), um den Zeiger an den Anfang der Datei zu bewegen
Johan Engblom
Ich las und schrieb in eine Datei. Die Antwort perfekt kürzt die Datei, aber Vorsicht , wenn Sie etwas schreiben wollen , um es wieder vergessen Sie nicht , hinzuzufügen , f.seek(0)nach f.truncate(0), sonst werden Sie seltsame haben \ x00 am Anfang der Datei angehängt.
krishna chaitanya
29

Keine vollständige Antwort, sondern eher eine Erweiterung der Antwort von ondra

truncate()Stellen Sie bei der Verwendung (meiner bevorzugten Methode) sicher, dass sich Ihr Cursor an der gewünschten Position befindet. Wenn eine neue Datei zum Lesen geöffnet wird open('FILE_NAME','r'), befindet sich der Cursor standardmäßig auf 0. Wenn Sie die Datei jedoch in Ihrem Code analysiert haben, stellen Sie sicher, dass Sie erneut auf den Anfang der Datei zeigen, dh truncate(0) standardmäßig wird truncate()der Inhalt einer Datei ab der aktuellen Cusror-Position abgeschnitten.

Ein einfaches Beispiel

Snigdha Batra
quelle
21

Wenn Sie eine Datei im "Schreib" -Modus öffnen, wird sie gelöscht. Sie müssen nicht speziell darauf schreiben:

open("filename", "w").close()

(Sie sollten es schließen, da der Zeitpunkt, zu dem die Datei automatisch geschlossen wird, möglicherweise implementierungsspezifisch ist.)

Douglas Leeder
quelle
10

Vom Benutzer @jamylak eine alternative Form von open("filename","w").close()IS

with open('filename.txt','w'): pass
CasualCoder3
quelle
8

Bei der Verwendung with open("myfile.txt", "r+") as my_file:werden seltsame Nullen angezeigt myfile.txt, insbesondere da ich die Datei zuerst lese. Damit es funktioniert, musste ich zuerst den Zeiger my_fileauf den Anfang der Datei mit ändern my_file.seek(0). Dann könnte ich my_file.truncate()die Datei löschen.

wcyn
quelle
1
Dies sollte nicht überraschen, es wurde in dieser Antwort 3 Jahre zuvor erwähnt.
AMC
6

Sie müssen die Datei überschreiben. In C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Alex Korban
quelle
1
Der close()Anruf ist nicht erforderlich . Der Destruktor schließt die Datei. Sie müssen also nur eine temporäre erstellen:ofstream("test.txt");
wilhelmtell
Diese Frage hat sich seit dieser Antwort geändert. Vielleicht die Frage angesichts der neuen Richtung der Frage löschen?
Seanny123
1

Wenn Sie den Dateizeiger in Ihrem Programm auf null setzen, wird nur dieser Verweis auf die Datei entfernt. Die Datei ist noch da. Ich denke, die remove()Funktion im c stdio.hist das, wonach Sie dort suchen. Ich bin mir nicht sicher über Python.

bsberry
quelle
2
Übrigens verringern sowohl remove () als auch unlink () die Referenzanzahl einer regulären Datei und löschen sie nicht. Die Datei wird gelöscht, sobald der Referenzzähler auf Null fällt. Wenn in Ihrem Prozess beispielsweise die Datei geöffnet ist und Sie unlink () oder remove () aufrufen, wird sie erst gelöscht, wenn die Datei close () d ist (dh die Anzahl der Refs fällt auf Null - setzt auch keine anderen Prozesse voraus habe die Datei geöffnet). Dieses Verhalten ist beispielsweise nützlich, um sicherzustellen, dass temporäre Dateien nach einem abnormalen Prozessabbruch nicht mehr übrig bleiben (z. B. open (), unlink (), Datei-E / A ausführen, CRASH , close () NICHT aufgerufen).
Nichtig
1

Wenn Ihnen die Sicherheit wichtig ist, reicht es nicht aus, die Datei zum Schreiben zu öffnen und wieder zu schließen. Zumindest einige der Informationen befinden sich noch auf dem Speichergerät und können beispielsweise mithilfe eines Dienstprogramms zur Wiederherstellung von Datenträgern gefunden werden.

Angenommen, die zu löschende Datei enthält beispielsweise Produktionskennwörter und muss sofort nach Abschluss des vorliegenden Vorgangs gelöscht werden.

Wenn Sie die Datei nach Beendigung nicht mehr füllen, können Sie sicherstellen, dass die vertraulichen Informationen zerstört werden.

In einem kürzlich durchgeführten Projekt haben wir den folgenden Code verwendet, der für kleine Textdateien gut geeignet ist. Der vorhandene Inhalt wird mit Nullen überschrieben.

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

Beachten Sie, dass eine Nullfüllung Ihre Sicherheit nicht garantiert. Wenn Sie wirklich besorgt sind, sollten Sie am besten null füllen und ein spezielles Dienstprogramm wie File Shredder oder CCleaner verwenden , um den "leeren" Speicherplatz auf Ihrem Laufwerk zu löschen.

Nick
quelle
0

Sie können eine vorhandene Datei nur dann "löschen", wenn Sie das Ende löschen müssen. Geben Sie sich entweder mit dem Überschreiben eines "leeren" Werts zufrieden oder lesen Sie die Teile der Datei, die Sie interessieren, und schreiben Sie sie in eine andere Datei.

Ignacio Vazquez-Abrams
quelle
ok, wie man es überschreibt, ohne Müllwert zu geben? Ich meine, nehme an, es gibt eine Stringlänge von 9 und ich überschreibe sie mit einer Stringlänge von 6. das würde 3 müllwerte bedeuten rt?
Hick
Richtig. Außerdem müssten Sie jedem Leser die Möglichkeit geben, die Tatsache zu identifizieren, dass diese 3 Zeichen Müll sind.
Ignacio Vazquez-Abrams
Tatsache ist, dass mein Code zwischen Python und C ++ aufgeteilt ist. Also, wenn eine Datei in C ++ gelesen und eine Datei in Python geschrieben wird .. sowohl die Zeit, in der die Datei gelöscht werden muss ..
Hick
0

Da Textdateien sequentiell sind, können Sie Daten auf ihnen nicht direkt löschen. Ihre Optionen sind:

  • Am häufigsten wird eine neue Datei erstellt. Lesen Sie aus der Originaldatei und schreiben Sie alles in die neue Datei, mit Ausnahme des Teils, den Sie löschen möchten. Wenn die gesamte Datei geschrieben wurde, löschen Sie die alte Datei und benennen Sie die neue Datei so um, dass sie den ursprünglichen Namen hat.
  • Sie können auch die gesamte Datei ab dem Punkt, den Sie ändern möchten, abschneiden und neu schreiben. Suchen Sie nach dem Punkt, den Sie ändern möchten, und lesen Sie den Rest der Datei in den Speicher. Suchen Sie zum selben Punkt zurück, schneiden Sie die Datei ab und schreiben Sie den Inhalt ohne den Teil zurück, den Sie löschen möchten.
  • Eine andere einfache Option besteht darin, die Daten mit anderen Daten gleicher Länge zu überschreiben. Suchen Sie dazu die genaue Position und schreiben Sie die neuen Daten. Die Einschränkung ist, dass es genau die gleiche Länge haben muss.

Schauen Sie sich die seek/ truncatefunction / method an, um eine der oben genannten Ideen umzusetzen. Sowohl Python als auch C haben diese Funktionen.

nosklo
quelle
Ich möchte nur die ganze Datei von Anfang an löschen
Hick
2
Dann entfernen Sie einfach die Datei. Verwenden Sie os.removeoder os.unlinkin Python oder unlinkin C. Eine andere Option besteht darin, die Datei einfach zum Schreiben oder Verwenden erneut zu öffnen truncate.
Nosklo
0

Schreiben und Lesen von Dateiinhalten

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

Es hat bei mir funktioniert

Mohd Tauovir Khan
quelle