tempfile - Anwendungsmöglichkeiten

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.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

habe hier http://openbook.galileocomputing.de/pyt ... 19_006.htm was mit tempfile gelesen.
Allerdings wird das dort nicht ausführlicher behandelt und da mein Englisch ziemlich gleich Null ist, hoffe ich auf Eure Unterstützung.

Dies

Code: Alles auswählen

import tempfile 
tmp = tempfile.TemporaryFile() 
tmp.write("Hallo Zwischenspeicher") 
tmp.seek(0)
ist mir, außer 'tmp.seek(0)' klar.
Was macht hier das 'tmp.seek(0)'?

Zu 'TemporaryFile' gibt es ja auch noch 'NamedTemporaryFile'.
Wäre das dann so

Code: Alles auswählen

tmp = tempfile.TemporaryFile(tempfilename) 
richt angewendet?

Wenn ich mit csv arbeite, wie ist dann die Handhabung?

Ich hoffe, Ihr könnt mir dabei helfen, mehr Klarheit zu tempfile zu bekommen.

Grüße Nobuddy
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Nobuddy hat geschrieben:Allerdings wird das dort nicht ausführlicher behandelt
Das wird wohl daran liegen, dass der Konstruktor mehr als ausreichend dokumentierte Dateiobjekte zurückgibt. Der Witz an temporären Dateien ist, dass sie immer einen zufällig gewählten Dateinamen aus Sicherheitsgründen bekommen (und um nicht mit vorhandenen Dateien zu kollidieren). In dem Sinne gibt dir NamedTempfile lediglich die Möglichkeit besagten zufällig gewählten Dateinamen zu erhalten.
Nobuddy hat geschrieben:da mein Englisch ziemlich gleich Null ist
Bitte, was. Ich hoffe du redest von deinen Englischkenntnissen, die du als angehender Programmierer sowieso haben und vertiefen solltest.

Lies dir bitte also den Abschnitt der offiziellen Dokumentation durch bis du alles verstanden hast. Selbiges gilt für den Umgang mit Dateien was deine Frage nach seek angeht.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

webspider hat geschrieben:
Nobuddy hat geschrieben:Allerdings wird das dort nicht ausführlicher behandelt
Das wird wohl daran liegen, dass der Konstruktor mehr als ausreichend dokumentierte Dateiobjekte zurückgibt. Der Witz an temporären Dateien ist, dass sie immer einen zufällig gewählten Dateinamen aus Sicherheitsgründen bekommen (und um nicht mit vorhandenen Dateien zu kollidieren). In dem Sinne gibt dir NamedTempfile lediglich die Möglichkeit besagten zufällig gewählten Dateinamen zu erhalten.
Nobuddy hat geschrieben:da mein Englisch ziemlich gleich Null ist
Bitte, was. Ich hoffe du redest von deinen Englischkenntnissen, die du als angehender Programmierer sowieso haben und vertiefen solltest.

Lies dir bitte also den Abschnitt der offiziellen Dokumentation durch bis du alles verstanden hast. Selbiges gilt für den Umgang mit Dateien was deine Frage nach seek angeht.
Obige Info haber ich auch gelesen.
Ich bin kein Programmierer, in dem Sinne wie Du es meinst. Da meine Englischkenntnisse wirklich nicht ausreichen, benutze ich Translater.
Glaube mir, daß ich das schon getan habe, komme da aber einfach nicht weiter.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sicher, dass du unbedingt Python nutzen willst? Ich mein, Programmieranfänger sein und schlechte Englischkenntnisse haben (und offenbar auch die fehlende Bereitschaft, sie zu erlernen) sind nicht gerade die besten Startvoraussetzungen.
Nobuddy hat geschrieben:Wenn ich mit csv arbeite, wie ist dann die Handhabung?
Wenn du wirklich nur CSV-Dateien bearbeiten willst/musst, dann könnte das `csvtool` (Ubuntu-Paket) vielleicht was für dich sein (sofern du die passende Plattform benutzt ;)). Das eignet sich vorwiegend zum Extrahieren bzw Modifzieren von CSV-Inhalten. Ein bißchen Bash-Kenntnisse sind da durchaus von Vorteil. Es gibt leider keine vernünftige Manpage für das Tool, aber ersatzweise erhält man mittels `csvtool --help | less` genügend Info zur Handhabung (zwar auf englisch, jedoch mit vielen Codebeispielen).

Ernsthaft: Vielleicht bist du am Ende glücklicher, wenn du Python *nicht* für die Erledigung deiner Aufgabe benutzt (ich entnehme dein mutmaßlich primäres Aufgabenfeld übrigens auch aus deinen anderen Beiträgen). :)
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

snafu hat geschrieben:Sicher, dass du unbedingt Python nutzen willst? Ich mein, Programmieranfänger sein und schlechte Englischkenntnisse haben (und offenbar auch die fehlende Bereitschaft, sie zu erlernen) sind nicht gerade die besten Startvoraussetzungen.
Nobuddy hat geschrieben:Wenn ich mit csv arbeite, wie ist dann die Handhabung?
Wenn du wirklich nur CSV-Dateien bearbeiten willst/musst, dann könnte das `csvtool` (Ubuntu-Paket) vielleicht was für dich sein (sofern du die passende Plattform benutzt ;)). Das eignet sich vorwiegend zum Extrahieren bzw Modifzieren von CSV-Inhalten. Ein bißchen Bash-Kenntnisse sind da durchaus von Vorteil. Es gibt leider keine vernünftige Manpage für das Tool, aber ersatzweise erhält man mittels `csvtool --help | less` genügend Info zur Handhabung (zwar auf englisch, jedoch mit vielen Codebeispielen).

Ernsthaft: Vielleicht bist du am Ende glücklicher, wenn du Python *nicht* für die Erledigung deiner Aufgabe benutzt (ich entnehme dein mutmaßlich primäres Aufgabenfeld übrigens auch aus deinen anderen Beiträgen). :)
Ja, ich will Python nutzen und es macht mir auch Spaß damit. Viele Dinge habe ich schon mit Python umgesetzt. Dank der Mithilfe anderer User, konnte ich schon Einiges umsetzen und mein Verständnis Python anzuwenden, nimmt stetig zu.
Meine Englischkenntnisse versuche ich auch zu erweitern, aber wenn man vorher kein Englisch konnte, dauert dies eben ...

Ist es wirklich so schwer für Euch als "Profi", sich in einen "Anfänger" der "fast" keine Vorkenntnisse auf diesem Gebiet hat, zu verstehen und vielleicht auch zu unterstützen?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nee, aber es ist anstrengend nem Anfänger, der kein Englisch kann, (potenziell) die Dokumentation vorlesen zu müssen. Aber gut, ich will keinen Streit anfangen. Werde mich mal wieder in meine dunkle Ecke zurückziehen... ;)
BlackJack

@Nobuddy: Was genau ist Dir an dem ``tmp.seek(0)`` denn nicht klar? Das Kapitel im OpenBook in dem Dateiobjekte behandelt werden und wo auch die `seek()`-Methode erwähnt wird, hast Du gelesen?
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Ok, hier http://openbook.galileocomputing.de/pyt ... 09_003.htm bin ich fündig geworden.
Definiert die Schreib-/Leseposition innerhalb der Datei, wenn ich das richtig verstanden habe.

Ich habe einen Denkfehler gemacht, da ich wie in diesem Beispiel:

Code: Alles auswählen

# Schreibe die Daten von datenpool in filename
def write_csv(filename, datenpool):
    with codecs.open(filename, "w") as zielfile:
        writer = csv.writer(zielfile, delimiter="\t", quotechar="^")
        writer.writerows(datenpool)
die Daten in einer Datei speichere, welche ich wieder aus einem anderen Script abrufen kann.

Was aber hier:

Code: Alles auswählen

# Schreiben in eine temporäre Datei (tmp)
def write_tmp(datenpool):
    tmp = tempfile.NamedTemporaryFile()
    tmp.write(datenpool)
    tmp.seek(0)
    string = tmp.read()
nicht der Fall ist.
Dachte zuerst, daß sich diese temporären Daten, auch aus einem anderen Script wieder abrufen lassen würden.

PS: snafu, keine Angst Streit liegt mir fern, sollte nur zum Nachdenken anregen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nobuddy hat geschrieben:Dachte zuerst, daß sich diese temporären Daten, auch aus einem anderen Script wieder abrufen lassen würden.
Das tun sie. NamedTemporaryFile hat dafuer ein `delete` Argument: http://docs.python.org/library/tempfile ... poraryFile
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Mir ist immer noch nicht klar, wie und wo der Name angewendet werden kann?
Ich habe dies

Code: Alles auswählen

# Schreiben in eine temporäre Datei (tmp)
def write_tmp(filename, datenpool):
    tmp = tempfile.NamedTemporaryFile()
    tmp.write(filename, datenpool)
    tmp.seek(0)
    string = tmp.read()
versucht, funktioniert aber nicht.
deets

Weil das ja auch konzeptioneller Bloedsinn ist. Du gibst einen Namen *REIN*, und willst gleichzeitig ein tempfile erzeugen, dass ja per definition einen zufaelligen Namen hat, damit es eben genau keine Kollision mit einem statisch definierten Namen gibt.

Ein NamedTempfile-Objekt hat einfach nur die Garantie, dass es einen Namen *GIBT*, den du nach Erzeugung ueber das Attribut ".name" abfragen kannst. Den kannst du dann zB zurueckgeben, damit du ein commandozeilne-tool damit fuetterst oder so.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Danke deets, jetzt bin ich einen Schritt weiter.

Code: Alles auswählen

# Schreiben in eine temporäre Datei (tmp)
def write_tmp(datenpool):
    tmp = tempfile.NamedTemporaryFile()
    tmp.write(datenpool)
    tmp.seek(0)
    string = tmp.read()
    tmpname = tmp.name
    print(tmpname)
Ausgabe:
/tmp/tmpo4zs34
Dann muß ich das nur noch mit der Ausgabeumleitung hinbekommen.
Mal schauen, ob ich das hinbekomme.
BlackJack

@Nobuddy: Dir ist schon klar das die Datein nach der Ausführung der Funktion nicht mehr da ist, oder zumindest nicht mehr garantiert da sein muss!?
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

BlackJack hat geschrieben:@Nobuddy: Dir ist schon klar das die Datein nach der Ausführung der Funktion nicht mehr da ist, oder zumindest nicht mehr garantiert da sein muss!?
Hmm, dann macht tempfile ja nur Sinn, wenn man dies innerhalb der Funktion nutzt.
Dann weiß ich jetzt aber, wie ich tempfile verwenden kann.

Danke, für den kleinen Schubs! :wink:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nobuddy hat geschrieben:
BlackJack hat geschrieben:@Nobuddy: Dir ist schon klar das die Datein nach der Ausführung der Funktion nicht mehr da ist, oder zumindest nicht mehr garantiert da sein muss!?
Hmm, dann macht tempfile ja nur Sinn, wenn man dies innerhalb der Funktion nutzt.
Das Problem ist nicht tempfile, sondern, dass du meinen Beitrag von oben ignorierst.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Hallo cofi,

sorry wenn ich nicht geantwortet habe, so habe ich mir wohl den Link von Dir angeschaut.
Laut Translater:
Diese Funktion funktioniert genau, wie TemporaryFile (), außer dass tut
die Datei wird versichert, um einen sichtbaren Namen im Dateisystem zu haben (darauf
Unix, der Verzeichniszugang wird nicht losgekettet). Dieser Name kann wiederbekommen werden
vom Namenattribut des Dateigegenstands. Ob der Name sein kann
verwendet, um die Datei ein zweites Mal zu öffnen, während die genannte vorläufige Datei ist
noch offen, ändert sich über Plattformen (es kann auf Unix so verwendet werden; es kann nicht
auf Windows NT oder später). Wenn löschen, ist wahr (der Verzug), die Datei ist
gelöscht, sobald es geschlossen wird.
Der zurückgegebene Gegenstand ist immer ein Dateimäßiggegenstand dessen Datei
Attribut ist der zu Grunde liegende wahre Dateigegenstand. Dieser Dateimäßiggegenstand kann
werden Sie in mit der Behauptung gerade wie eine normale Datei verwendet.
Verstehe ich das richtig, daß bei 'delete=True' nach beenden der Funktion, die temporäre Datei geschlossen wird, während bei 'delete=False', die temporäre Datei auch nach dem Beenden der Funktion weiter existiert?

Ich habe mal die versucht:

Code: Alles auswählen

# Schreiben in eine temporäre Datei (tmp)
daten = []
def write_tmp(datenpool):
    tmp = tempfile.NamedTemporaryFile(delete=False)
    tmp.write(datenpool)
    tmp.seek(0)
    string = tmp.read()
    tmpname = tmp.name
    daten.append(tmpname)
    print(tmpname)
Jetzt kann ich zwar von einem anderen Script aus auf die temporäre Datei zugreifen, wie z.B.

Code: Alles auswählen

  
with codecs.open(daten[0], "r") as infile:
    reader = csv.reader(infile, delimiter="\t", quotechar="^")

    for item in reader:
        print(item)
und bekomme den Inhalt der Datei.
Bei 'delete=True' wird die Datei gleich beim Beendigen der Funktion gelöscht, wie ich es oben vermutet habe.

Ist mein Resume so richtig?

Danke cofi, für Deine Hartnäckigkeit! :wink:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nobuddy hat geschrieben:Bei 'delete=True' wird die Datei gleich beim Beendigen der Funktion gelöscht, wie ich es oben vermutet habe.

Ist mein Resume so richtig?
Bis auf die Kleinigkeit, dass das Loeschen beim Schliessen der TemporaryFiles ins Spiel kommt. Bei CPython ist das identisch, bei PyPy aber afaik nicht, hier wuerde deine Datei auch sonst nie geloescht. Du solltest auch TemporaryFiles in ein `with` packen.
Nobuddy hat geschrieben:Danke cofi, für Deine Hartnäckigkeit! :wink:
Gern geschehen.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Protip: Online-Übersetzer funktionieren am besten mit einzelnen Worten.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde das Übersetzen auch eher mit einzelnen Worten statt mit kompletten Absätzen machen. Vorher hatte ich dafür LEO benutzt, inzwischen nehme ich lieber dict.cc, weil ich den Eindruck habe, die Treffer/passenden Übersetzungen sind dort insgesamt besser.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

cofi hat geschrieben:Du solltest auch TemporaryFiles in ein `with` packen.
Bin mir nicht ganz im Klaren wie, hast Du mir evtl. ein kurzes Beispiel?
Antworten