it-swarm.com.de

So löschen Sie nur den Inhalt der Datei in python

Ich habe eine temporäre Datei mit etwas Inhalt und einem python Skript, das eine Ausgabe für diese Datei generiert. Ich möchte, dass dies N-mal wiederholt wird, also muss ich diese Datei (tatsächlich ein Array von Dateien) wiederverwenden. Ich lösche den gesamten Inhalt, sodass die temporäre Datei im nächsten Zyklus leer ist. Zum Löschen des Inhalts verwende ich diesen Code:

def deleteContent(pfile):

    pfile.seek(0)
    pfile.truncate()
    pfile.seek(0) # I believe this seek is redundant

    return pfile

tempFile=deleteContent(tempFile)

Meine Frage ist: Gibt es eine andere (bessere, kürzere oder sicherere) Möglichkeit, den gesamten Inhalt zu löschen, ohne die temporäre Datei tatsächlich von der Festplatte zu löschen?

So etwas wie tempFile.truncateAll()?

34
bartimar

So löschen Sie nur den Inhalt der Datei in Python

Es gibt verschiedene Möglichkeiten, die logische Größe einer Datei auf 0 zu setzen, je nachdem, wie Sie auf diese Datei zugreifen:

So leeren Sie eine geöffnete Datei:

def deleteContent(pfile):
    pfile.seek(0)
    pfile.truncate()

So leeren Sie eine geöffnete Datei, deren Dateideskriptor bekannt ist:

def deleteContent(fd):
    os.ftruncate(fd, 0)
    os.lseek(fd, 0, os.SEEK_SET)

So leeren Sie eine geschlossene Datei (deren Name bekannt ist)

def deleteContent(fName):
    with open(fName, "w"):
        pass


Ich habe eine temporäre Datei mit etwas Inhalt [...], die ich wiederverwenden muss diese Datei

Davon abgesehen, im allgemeinen Fall ist es wahrscheinlich weder effizient noch wünschenswert, wiederzuverwenden eine temporäre Datei. Sofern Sie keine besonderen Bedürfnisse haben, sollten Sie überlegen, tempfile.TemporaryFile und ein Kontextmanager, um Ihre temporären Dateien fast transparent zu erstellen/verwenden/löschen:

import tempfile

with tempfile.TemporaryFile() as temp:
     # do whatever you want with `temp`

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on exit of the context manager
72
Sylvain Leroux

Ich denke, am einfachsten ist es, die Datei im Schreibmodus zu öffnen und dann zu schließen. Zum Beispiel, wenn Ihre Datei myfile.dat enthält:

"This is the original content"

Dann können Sie einfach schreiben:

f = open('myfile.dat', 'w')
f.close()

Dies würde den gesamten Inhalt löschen. Dann können Sie den neuen Inhalt in die Datei schreiben:

f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()
5
Peaceful

Du kannst das:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')
2
the wolf

Was könnte einfacher sein als so etwas:

import tempfile

for i in range(400):
    with tempfile.TemporaryFile() as tf:
        for j in range(1000):
            tf.write('Line {} of file {}'.format(j,i))

Das erstellt 400 temporäre Dateien und schreibt 1000 Zeilen in jede temporäre Datei. Es wird in weniger als einer halben Sekunde auf meinem unauffälligen Computer ausgeführt. Jede temporäre Datei der Summe wird erstellt und gelöscht, wenn der Kontextmanager in diesem Fall geöffnet und geschlossen wird. Es ist schnell, sicher und plattformübergreifend.

tempfile ist viel besser, als es neu zu erfinden.

2
dawg