os remove() - einzige Möglichkeit, file zu löschen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Hi!

Ich bin gerade dabei, im Byte of Python mit Pickling herumzuspielen. Im kurzen Testcode wird shoplistfile='shoplist.data' mit f = file(shoplistfile, 'w') und p.dump(shoplist, f) eine Liste gespeichert, dann wird die Liste intern gelöscht und wieder über p.load(f) hervorgerufen.
Nun, angenommen, ich möchte diese neu kreierte Datei shoplist.data am Schluss des Programms wieder löschen. Geht das nur durch import os und dann remove('path')?
Das mühsame ist, dass ich dann immer den genauen Pfad der Datei kennen muss, wobei es praktischer wäre, durch etwas wie del f.shoplistfile o.ä. darauf zugreifen zu können.
In der file-Beschreibung gibt es eine Funktion del x.name, jedoch setze ich sie entweder falsch ein, oder sie ist einfach nicht gedacht, um das ganze File zu löschen.

Danke für eine kurze Rückmeldung =)

lg Seeker
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zu allererst sollte man ``open`` statt ``file`` verwenden, die waren mal synonym, sind es aber nicht mehr (jaa ich weiss, dass ist nicht deine Schuld)

Den Pfad hast du doch sowieso schon, wenn du dein Objekt abspeicherst, also ist der Pfad kein Problem.

``os`` wird durch den Interpreter sowieso schon geladen, also gibt es dadurch auch keinen Overhead.

``del`` loescht nur den Namen, nicht einmal das Objekt, wenn noch andere Referenzen existieren. Durch eine eigene Klasse und deren Destruktur, liesse sich das auch erreichen _aber_ Python kann keine Garantien geben, dass der Destruktor aufgerufen wird, deshalb ist der Weg nicht gangbar.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Seeker: Du missverstehst `del()` wie gesagt. Das Attribut `name`, welches es übrigens auch bei `open()` gibt, trägt lediglich einen String mit dem Dateinamen in sich. Das hat nichts damit zu tun, dass da die "tatsächliche" Datei drinstecken würde. Intern ruft Python ja eh nur die entsprechenden C-Befehle zum Öffnen/Lesen/Schreiben/Löschen/Was-auch-immer der Datei auf. Das heißt, da sind nicht wirklich 18KB Datei-Inhalt (fiktive Zahl) in deinem `file`-Objekt, sondern es ist nur eine Art Wrapper, der solche Datei-Operationen in Python möglich macht.

@cofi: Ich weiß, dass man `file()` nicht mehr verwenden soll, aber kannst du (von mir auch jemand anders) eventuell nähere Angaben zu den Gründen machen? Es ist ja auch möglich, eine eigene Klasse von `file` abzuleiten, d.h. da "darf" man es anscheinend.

EDIT: Und um auf deine eigentlich Frage zurückzukommen, Seeker, erscheint mir das Modul [mod]tempfile[/mod] auch ganz gut geeignet. Das kümmert sich für dich um's spätere Löschen einer Datei und "denkt" sich auch einen Namen für dich aus.
Zuletzt geändert von snafu am Montag 21. September 2009, 11:21, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:@cofi: Ich weiß, dass man `file()` nicht mehr verwenden soll, aber kannst du (von mir auch jemand anders) eventuell nähere Angaben zu den Gründen machen? Es ist ja auch möglich, eine eigene Klasse von `file` abzuleiten, d.h. da "darf" man es anscheinend.
Guido meint zum Ableiten ``file`` (weil Ableiten von ``open`` auch irgendwie komisch ausschaut) und zum Öffnen von Dateien ``open``. Funktionieren tun beide Wege im Endeffekt gleich, wenn man nur eine Datei öffnen will.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich sehe ein, dass es "ästhetischer" ist, je nach konkretem Fall entweder `open()` oder `file()` zu verwenden. Irritiert war ich halt nur von cofis Anmerkung, beide Funktionen seien früher identisch gewesen und jetzt nicht mehr.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

In Python 3(.1) gibt es kein ``file`` mehr und ab Python 2.7 gibt es die neue IO Library von 3.1 wie ``file`` dort gehandhabt wird, fand ich leider nicht auf die schnelle.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Super, danke!
Ich habe nun "file" durch "open" ersetzt. Dazu habe ich ein paar Versuche mit path.abspath gemacht. Komischerweise funktioniert nun alles auch ohne abspath, sondern nur mit remove(filename), ohne den ganzen Pfad angeben zu müssen.
Keine Ahnung was genau anders ist, aber auf jeden Fall scheint das Problem gelöst zu sein ;).

@snafu:
Danke für den Hinweis.
Die Beschreibung ist mir jedoch etwas unklar...
TemporaryFile: Return a file-like object that can be used as a temporary storage area. The file is created using mkstemp(). It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected). Under Unix, the directory entry for the file is removed immediately after the file is created.
Mkstemp: Unlike TemporaryFile(), the user of mkstemp() is responsible for deleting the temporary file when done with it.

Also, wenn ichs richtig verstanden habe, dann wird nur das Object gelöscht, aber das File muss man immer noch 'manuell' entfernen?
Aber inwiefern ist mkstemp dann ein "temporary file", wenn mans selber löschen muss? ^^
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Seeker hat geschrieben:Also, wenn ichs richtig verstanden habe, dann wird nur das Object gelöscht, aber das File muss man immer noch 'manuell' entfernen?
Aber inwiefern ist mkstemp dann ein "temporary file", wenn mans selber löschen muss? ^^
Ich vertehs so:

Code: Alles auswählen

 f = #das File das die Lib erstellt
# mach irgendwas
f.close() # das file wird von der Lib gelöscht
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Dav1d: Da ``mkstemp`` auch den Namen zurueckgibt, glaube ich das nicht, zumal ``TempFile`` auch geschlossen werden muss.

@Seeker: Die Datei wird in den richtigen Ordner gelegt (/tmp, Windows hat etwas vergleichbares), der von OS auch sauber gehalten wird. Daneben kann man auch nachdem die Datei geschlossen wurde, wieder auf sie zugreifen. Fuer die Faelle an denen man das nicht braucht, gibt es schliesslich ``TempFile``.

Die Frage ist natuerlich, ob du ueberhaupt ein tempfile willst. Wenn es dir um Persistenz, d.h. das dauerhafte Speichern der Daten, geht, dann solltest du davon Abstand nehmen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bzw du solltest sagen, warum du überhaupt Dinge sozusagen innerhalb einer Sitzung in Dateien pickeln und entpickeln willst (hihi, das erinnert mich gerade an einen pubertierenden Teenager) und warum die die Datein am Ende löschst. Also es kann Fälle geben, wo man Objekte tatsächlich mittels Pickle herumreichen muss (ich hatte das zumindest mal beim Implementieren eines Terminals), aber dann sollte man nicht in Dateien schreiben, sondern Pickles `loads()` bzw `dumps()` Methode nutzen, welche die gepickelte Datenstruktur in Strings statt in Dateien ablegt.
Seeker
User
Beiträge: 70
Registriert: Mittwoch 16. September 2009, 19:52

Warum weiss ich konkret auch nicht... ich habe auch noch nicht so viel Programmiererfahrung (gar keine ^^), d.h. wenig Vorstellung, was ich genau wann brauchen werde. Aber vielleicht will man ein externes Programm aufrufen, und dort den Inhalt einer Datei verwenden. Das externe Programm braucht möglicherweise eine fest gespeicherte Datei, aber da man eigentlich nur Inhalt zur Verarbeitung schicken möchte, braucht man die Datei nach dem Transfer nicht mehr =).
Kurz gesagt, es war einfach der Neugier Willen ;).
Antworten