Seite 1 von 2

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 08:57
von Nobuddy
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:

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 11:35
von cofi
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.

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 11:42
von webspider
Protip: Online-Übersetzer funktionieren am besten mit einzelnen Worten.

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 12:37
von snafu
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.

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 16:57
von Nobuddy
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?

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 17:07
von cofi
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))

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Donnerstag 15. März 2012, 18:34
von Nobuddy
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:

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 13:56
von Nobuddy
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!']

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 14:04
von Hyperion
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.

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 14:06
von EyDu
Übersehe ich etwas, oder ist das

Code: Alles auswählen

tmp.seek(0)
string = tmp.read()
einfach nur überflüssig?

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 14:57
von Nobuddy
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.

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 17:41
von Nobuddy
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?

Re: tempfile - Anwendungsmöglichkeiten

Verfasst: Freitag 16. März 2012, 18:34
von EyDu
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 ;-)