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: 994
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: 994
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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Genauso wie alles andere auch:

Code: Alles auswählen

 # Schreiben in eine temporäre Datei (tmp)
daten = []
def write_tmp(datenpool):
    with tempfile.NamedTemporaryFile(delete=False) as tmp:
        tmp.write(datenpool)
        tmp.seek(0)
        string = tmp.read()
        tmpname = tmp.name
        daten.append(tmpname)
        print(tmpname)
Das globale Daten ist auch unschoen, besser waere es, wenn du einfach den Namen zurueckgibst und die Verwaltung vom aufrufenden Code machen laesst:

Code: Alles auswählen

 # Schreiben in eine temporäre Datei (tmp)
daten = []
def write_tmp(datenpool):
    with tempfile.NamedTemporaryFile(delete=False) as tmp:
        tmp.write(datenpool)
        tmp.seek(0)
        string = tmp.read()
        return tmp.name
daten.append(write_tmp(dein_datenpool))
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Danke cofi für Deine Hilfe,
ich werde dies so umsetzen und die zweite Variante nehmen, die Lösung ist eleganter, wie Du schon geschrieben hast! :wink:
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich versuche gerade eine Möglichkeit zu finden, in die temporäre Datei weitere Daten anzufügen.
Irgendwie funktioniert das aber nicht so, wie gewünscht.
Ich habe dazu ein kleines Beispiel erstellt:

Code: Alles auswählen

num1 = 'Hallo,'
num2 = 'ich heiße Wolfgang!'

# Schreiben in eine temporäre Datei (tmp)
tempname = []
def write_tmp(datenpool):
    with tempfile.NamedTemporaryFile(delete=False) as tmp:
        tmp.write(datenpool)
        tmp.seek(0)
        string = tmp.read()
        return tmp.name

tempname.append(write_tmp(num1 + ' ' + num2))

print(tempname[0])

daten = []
# Anfügen in eine temporäre Datei (tmp) <<>> fehlerhaft
def writeappend_tmp(filename, datenpool):
    with codecs.open(filename, "a") as tmp:
        writer = csv.writer(tmp, delimiter="\t", quotechar="^")
        writer.writerows(datenpool)
  
t = (num1 + ' ' + num2)
writeappend_tmp(tempname[0], t)
  
with codecs.open(tempname[0], "r") as infile:
    reader = csv.reader(infile, delimiter="\t", quotechar="^")

    for item in reader:
        print(item)
Als Ausgabe erhalte ich dann:
/tmp/tmp6s30Tt
['Hallo, ich hei\xc3\x9fe Wolfgang!H']
['a']
['l']
['l']
['o']
[', ']
[' ']
['i']
['c']
['h']
[' ']
['h']
['e']
['i']
['\sxc3']
['\x9f']
['e']
[' ']
['W']
['o']
['l']
['f']
['g']
['a']
['n']
['g']
['!']
Hat da jemand von Euch vielleicht eine Idee, warum beim anfügen von Daten in die temporäre Datei, so eine Ausgabe kommt?

Normal sollte so etwas kommen:
/tmp/tmp6s30Tt
['Hallo, ich hei\xc3\x9fe Wolfgang!']
['Hallo, ich hei\xc3\x9fe Wolfgang!']
Zuletzt geändert von Hyperion am Freitag 16. März 2012, 13:59, insgesamt 1-mal geändert.
Grund: Code-Tag auf Python umgestellt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also Dein Code ist im ganzen ziemlich "verworren" und unschön.

Dein Problem liegt an dem ``writerows``! Lass mal das ``s`` weg ;-) Du hast ja keine Sequenz von Strings, sondern nur einen String! Dieser wird von ``writerows`` als Sequenz aufgefasst und entsprechend geht er das Ding Zeichen für Zeichen durch.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Übersehe ich etwas, oder ist das

Code: Alles auswählen

tmp.seek(0)
string = tmp.read()
einfach nur überflüssig?
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hyperion, habe dies jetzt mal so abgeändert:

Code: Alles auswählen

daten = []
# Anfügen in eine temporäre Datei (tmp) <<>> fehlerhaft
def writeappend_tmp(filename, datenpool):
    with codecs.open(filename, "a") as tmp:
        tmp.write(datenpool)
writrow bringt zwar gegenüber writerows alles in eine Zeile, aber jedes Zeichen wird seperat mit '' eingeschlossen.
Mit 'tmp.write(datenpool)' hingegen, wird alles fehlerfrei angezeigt.
Das Einzigste ist, wie in meinem Beispiel hier, am Ende einen Zeilenumbruch zu erzeugen.
Sonst wird alles hintereinander angefügt.

Code: Alles auswählen

tempname.append(write_tmp(num1 + ' ' + num2 + '\n'))
Hallo Eydu, habe mal

Code: Alles auswählen

tmp.seek(0)
string = tmp.read()
weggelassen.
Für mich ist kein Unterschied feststellbar, anscheinend wie Du sagst überflüssig.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Den Zeilenumbruch, habe ich jetzt gleich in der Funktion mit eingebaut.

Code: Alles auswählen

# Schreiben in eine temporäre Datei (tmp)
tempname = []
def write_tmp(datenpool):
    with tempfile.NamedTemporaryFile(delete=False) as tmp:
        tmp.write(datenpool + '\n')
        return tmp.name

daten = []
# Anfügen in eine temporäre Datei (tmp)
def writeappend_tmp(filename, datenpool):
    with codecs.open(filename, "a") as tmp:
        tmp.write(datenpool + '\n')
Was mich noch interessiert ist, ob man tempfile auch in Verbindung mit dem csv-Modul nutzen kann?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nobuddy hat geschrieben:Was mich noch interessiert ist, ob man tempfile auch in Verbindung mit dem csv-Modul nutzen kann?
Natürlich. So etwas kannst du aber auch einfach selber ausprobieren ;-)
Das Leben ist wie ein Tennisball.
Antworten