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.
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: 1019
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: 1019
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: 1019
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: 1019
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