tempfile — Temporäre Dateien und Verzeichnisse generieren¶
Quellcode: Lib/tempfile.py
Dieses Modul erstellt temporäre Dateien und Verzeichnisse. Es funktioniert auf allen unterstützten Plattformen. TemporaryFile, NamedTemporaryFile, TemporaryDirectory und SpooledTemporaryFile sind High-Level-Schnittstellen, die eine automatische Bereinigung bieten und als Kontextmanager verwendet werden können. mkstemp() und mkdtemp() sind Low-Level-Funktionen, die eine manuelle Bereinigung erfordern.
Alle benutzbaren Funktionen und Konstruktoren akzeptieren zusätzliche Argumente, die eine direkte Kontrolle über den Speicherort und den Namen von temporären Dateien und Verzeichnissen ermöglichen. Dateinamen, die von diesem Modul verwendet werden, enthalten eine Zeichenkette zufälliger Zeichen, die eine sichere Erstellung dieser Dateien in gemeinsamen temporären Verzeichnissen ermöglicht. Um die Abwärtskompatibilität zu wahren, ist die Reihenfolge der Argumente etwas ungewöhnlich; es wird empfohlen, Schlüsselwortargumente für mehr Klarheit zu verwenden.
Das Modul definiert die folgenden benutzbaren Elemente
- tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Gibt ein dateiähnliches Objekt zurück, das als temporärer Speicherbereich verwendet werden kann. Die Datei wird sicher erstellt, unter Verwendung derselben Regeln wie bei
mkstemp(). Sie wird zerstört, sobald sie geschlossen wird (einschließlich eines impliziten Schließens, wenn das Objekt garbage collected wird). Unter Unix wird der Verzeichniseintrag der Datei entweder gar nicht erstellt oder unmittelbar nach der Erstellung der Datei entfernt. Andere Plattformen unterstützen dies nicht; Ihr Code sollte sich nicht darauf verlassen, dass eine temporäre Datei, die mit dieser Funktion erstellt wurde, einen sichtbaren Namen im Dateisystem hat oder nicht.Das resultierende Objekt kann als Kontextmanager verwendet werden (siehe Beispiele). Nach Abschluss des Kontexts oder der Zerstörung des Datei-Objekts wird die temporäre Datei aus dem Dateisystem entfernt.
Der Parameter mode hat standardmäßig
'w+b', sodass die erstellte Datei gelesen und geschrieben werden kann, ohne sie zu schließen. Der binäre Modus wird verwendet, damit er auf allen Plattformen konsistent funktioniert, unabhängig von den gespeicherten Daten. buffering, encoding, errors und newline werden wie füropen()interpretiert.Die Parameter dir, prefix und suffix haben die gleiche Bedeutung und Standardwerte wie bei
mkstemp().Das zurückgegebene Objekt ist auf POSIX-Plattformen ein echtes Datei-Objekt. Auf anderen Plattformen ist es ein dateiähnliches Objekt, dessen Attribut
filedas zugrunde liegende echte Datei-Objekt ist.Das Flag
os.O_TMPFILEwird verwendet, wenn es verfügbar und funktionsfähig ist (Linux-spezifisch, erfordert Linux-Kernel 3.11 oder neuer).Auf Plattformen, die weder Posix noch Cygwin sind, ist TemporaryFile ein Alias für NamedTemporaryFile.
Löst ein Audit-Ereignis
tempfile.mkstempmit dem Argumentfullpathaus.Geändert in Version 3.5: Das Flag
os.O_TMPFILEwird nun verwendet, wenn es verfügbar ist.Geändert in Version 3.8: Parameter errors hinzugefügt.
- tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)¶
Diese Funktion arbeitet genau wie
TemporaryFile(), mit den folgenden UnterschiedenDiese Funktion gibt eine Datei zurück, die garantiert einen sichtbaren Namen im Dateisystem hat.
Zur Verwaltung der benannten Datei erweitert sie die Parameter von
TemporaryFile()um die Parameter delete und delete_on_close, die bestimmen, ob und wie die benannte Datei automatisch gelöscht werden soll.
Das zurückgegebene Objekt ist immer ein dateiähnliches Objekt, dessen Attribut
filedas zugrunde liegende echte Datei-Objekt ist. Dieses dateiähnliche Objekt kann in einerwith-Anweisung verwendet werden, genau wie eine normale Datei. Der Name der temporären Datei kann aus dem Attributnamedes zurückgegebenen dateiähnlichen Objekts abgerufen werden. Unter Unix wird im Gegensatz zuTemporaryFile()der Verzeichniseintrag nicht sofort nach der Dateierstellung aus dem Verzeichnis entfernt.Wenn delete wahr ist (Standard) und delete_on_close wahr ist (Standard), wird die Datei gelöscht, sobald sie geschlossen wird. Wenn delete wahr ist und delete_on_close falsch ist, wird die Datei nur beim Verlassen des Kontextmanagers gelöscht, oder wenn das dateiähnliche Objekt finalisiert wird. Die Löschung ist in diesem Fall nicht immer garantiert (siehe
object.__del__()). Wenn delete falsch ist, wird der Wert von delete_on_close ignoriert.Um den Namen der temporären Datei zur Wiedereröffnung der Datei nach dem Schließen zu verwenden, stellen Sie entweder sicher, dass die Datei nicht beim Schließen gelöscht wird (setzen Sie den Parameter delete auf falsch) oder, falls die temporäre Datei in einer
with-Anweisung erstellt wird, setzen Sie den Parameter delete_on_close auf falsch. Letzterer Ansatz wird empfohlen, da er bei der automatischen Bereinigung der temporären Datei beim Verlassen des Kontextmanagers hilft.Das erneute Öffnen der temporären Datei über ihren Namen, während sie noch geöffnet ist, funktioniert wie folgt
Unter POSIX kann die Datei immer wieder geöffnet werden.
Unter Windows stellen Sie sicher, dass mindestens eine der folgenden Bedingungen erfüllt ist
delete ist falsch
zusätzliches Öffnen teilt sich den Löschzugriff (z. B. durch Aufruf von
os.open()mit dem FlagO_TEMPORARY)delete ist wahr, aber delete_on_close ist falsch. Beachten Sie, dass in diesem Fall die zusätzlichen Öffnungen, die den Löschzugriff nicht teilen (z. B. über das eingebaute
open()erstellt), vor dem Verlassen des Kontextmanagers geschlossen werden müssen, andernfalls schlägt deros.unlink()-Aufruf beim Verlassen des Kontextmanagers mit einemPermissionErrorfehl.
Unter Windows, wenn delete_on_close falsch ist und die Datei in einem Verzeichnis erstellt wird, für das der Benutzer keine Löschzugriffsberechtigung hat, schlägt der Aufruf von
os.unlink()beim Verlassen des Kontextmanagers mit einemPermissionErrorfehl. Dies kann nicht passieren, wenn delete_on_close wahr ist, da der Löschzugriff durch das Öffnen angefordert wird, was sofort fehlschlägt, wenn der angeforderte Zugriff nicht gewährt wird.Unter POSIX (nur) kann ein Prozess, der abrupt mit SIGKILL beendet wird, keine von ihm erstellten NamedTemporaryFiles automatisch löschen.
Löst ein Audit-Ereignis
tempfile.mkstempmit dem Argumentfullpathaus.Geändert in Version 3.8: Parameter errors hinzugefügt.
Geändert in Version 3.12: Parameter delete_on_close hinzugefügt.
- class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Diese Klasse arbeitet genau wie
TemporaryFile(), außer dass Daten im Speicher gehalten werden, bis die Dateigröße max_size überschreitet, oder bis die Methodefileno()der Datei aufgerufen wird. Zu diesem Zeitpunkt werden die Inhalte auf die Festplatte geschrieben und die Operation wird fortgesetzt wie beiTemporaryFile().- rollover()¶
Die resultierende Datei hat eine zusätzliche Methode,
rollover(), die dazu führt, dass die Datei unabhängig von ihrer Größe auf eine Festplattendatei umgestellt wird.
Das zurückgegebene Objekt ist ein dateiähnliches Objekt, dessen Attribut
_fileentweder einio.BytesIO- oderio.TextIOWrapper-Objekt ist (abhängig davon, ob der binäre oder Textmodus angegeben wurde) oder ein echtes Datei-Objekt, je nachdem, obrollover()aufgerufen wurde. Dieses dateiähnliche Objekt kann wie eine normale Datei in einerwith-Anweisung verwendet werden.Geändert in Version 3.3: Die Methode truncate akzeptiert nun ein Argument size.
Geändert in Version 3.8: Parameter errors hinzugefügt.
Geändert in Version 3.11: Implementiert vollständig die abstrakten Basisklassen
io.BufferedIOBaseundio.TextIOBase(abhängig davon, ob der binäre oder Textmodus angegeben wurde).
- class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)¶
Diese Klasse erstellt sicher ein temporäres Verzeichnis, unter Verwendung derselben Regeln wie bei
mkdtemp(). Das resultierende Objekt kann als Kontextmanager verwendet werden (siehe Beispiele). Nach Abschluss des Kontexts oder der Zerstörung des temporären Verzeichnisobjekts werden das neu erstellte temporäre Verzeichnis und alle seine Inhalte aus dem Dateisystem entfernt.- name¶
Der Verzeichnisname kann aus dem Attribut
namedes zurückgegebenen Objekts abgerufen werden. Wenn das zurückgegebene Objekt als Kontextmanager verwendet wird, wird dernameder Zielvariable deras-Klausel in derwith-Anweisung zugewiesen, falls vorhanden.
- cleanup()¶
Das Verzeichnis kann explizit durch Aufruf der Methode
cleanup()bereinigt werden. Wenn ignore_cleanup_errors wahr ist, werden alle unbehandelten Ausnahmen während der expliziten oder impliziten Bereinigung (wie einPermissionErrorbeim Entfernen geöffneter Dateien unter Windows) ignoriert, und die verbleibenden löschbaren Elemente werden "nach bestem Vermögen" gelöscht. Andernfalls werden im jeweiligen Kontext, in dem die Bereinigung stattfindet (der Aufruf voncleanup(), das Verlassen des Kontextmanagers, wenn das Objekt garbage collected wird oder während des Beendens des Interpreters), Fehler ausgelöst.
Der Parameter delete kann verwendet werden, um die Bereinigung des Verzeichnisbaums beim Verlassen des Kontexts zu deaktivieren. Obwohl es für einen Kontextmanager ungewöhnlich erscheinen mag, die Aktion beim Verlassen des Kontexts zu deaktivieren, kann dies beim Debuggen oder wenn Sie möchten, dass Ihr Bereinigungsverhalten bedingt von anderer Logik abhängt, nützlich sein.
Löst ein Audit-Ereignis
tempfile.mkdtempmit dem Argumentfullpathaus.Hinzugefügt in Version 3.2.
Geändert in Version 3.10: Parameter ignore_cleanup_errors hinzugefügt.
Geändert in Version 3.12: Parameter delete hinzugefügt.
- tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)¶
Erstellt eine temporäre Datei auf die sicherste mögliche Weise. Es gibt keine Race Conditions bei der Erstellung der Datei, vorausgesetzt, die Plattform implementiert das Flag
os.O_EXCLfüros.open()korrekt. Die Datei ist nur für den erstellenden Benutzer lesbar und beschreibbar. Wenn die Plattform Berechtigungsbits verwendet, um anzugeben, ob eine Datei ausführbar ist, ist die Datei für niemanden ausführbar. Der Dateideskriptor wird nicht an Kindprozesse vererbt.Im Gegensatz zu
TemporaryFile()ist der Benutzer vonmkstemp()dafür verantwortlich, die temporäre Datei zu löschen, wenn er sie nicht mehr benötigt.Wenn suffix nicht
Noneist, endet der Dateiname mit diesem Suffix; andernfalls gibt es kein Suffix.mkstemp()fügt keinen Punkt zwischen Dateiname und Suffix ein; wenn Sie einen benötigen, setzen Sie ihn an den Anfang von suffix.Wenn prefix nicht
Noneist, beginnt der Dateiname mit diesem Präfix; andernfalls wird ein Standardpräfix verwendet. Standardmäßig ist dies der Rückgabewert vongettempprefix()odergettempprefixb(), je nachdem.Wenn dir nicht
Noneist, wird die Datei in diesem Verzeichnis erstellt; andernfalls wird ein Standardverzeichnis verwendet. Das Standardverzeichnis wird aus einer plattformabhängigen Liste ausgewählt, aber der Benutzer der Anwendung kann den Verzeichnisspeicherort steuern, indem er die Umgebungsvariablen TMPDIR, TEMP oder TMP setzt. Es gibt daher keine Garantie, dass der generierte Dateiname nützliche Eigenschaften hat, wie z. B. dass er nicht zitiert werden muss, wenn er überos.popen()an externe Befehle übergeben wird.Wenn eines der Argumente suffix, prefix und dir nicht
Noneist, müssen sie vom gleichen Typ sein. Wenn sie Bytes sind, wird der zurückgegebene Name Bytes anstelle von str sein. Wenn Sie einen Byte-Rückgabewert mit ansonsten Standardverhalten erzwingen möchten, übergeben Siesuffix=b''.Wenn text angegeben und wahr ist, wird die Datei im Textmodus geöffnet. Andernfalls (Standard) wird die Datei im Binärmodus geöffnet.
mkstemp()gibt ein Tupel zurück, das einen Betriebssystem-Handle für eine offene Datei (wie vonos.open()zurückgegeben) und den absoluten Pfad dieser Datei enthält, in dieser Reihenfolge.Löst ein Audit-Ereignis
tempfile.mkstempmit dem Argumentfullpathaus.Geändert in Version 3.5: suffix, prefix und dir können jetzt als Bytes übergeben werden, um einen Byte-Rückgabewert zu erhalten. Zuvor war nur str erlaubt. suffix und prefix akzeptieren nun und verwenden standardmäßig
None, um einen geeigneten Standardwert zu verwenden.Geändert in Version 3.6: Der Parameter dir akzeptiert nun ein pfadähnliches Objekt.
- tempfile.mkdtemp(suffix=None, prefix=None, dir=None)¶
Erstellt ein temporäres Verzeichnis auf die sicherste mögliche Weise. Es gibt keine Race Conditions bei der Erstellung des Verzeichnisses. Das Verzeichnis ist nur für den erstellenden Benutzer lesbar, beschreibbar und durchsuchbar.
Der Benutzer von
mkdtemp()ist dafür verantwortlich, das temporäre Verzeichnis und seinen Inhalt zu löschen, wenn er sie nicht mehr benötigt.Die Argumente prefix, suffix und dir sind die gleichen wie bei
mkstemp().mkdtemp()gibt den absoluten Pfad des neuen Verzeichnisses zurück.Löst ein Audit-Ereignis
tempfile.mkdtempmit dem Argumentfullpathaus.Geändert in Version 3.5: suffix, prefix und dir können jetzt als Bytes übergeben werden, um einen Byte-Rückgabewert zu erhalten. Zuvor war nur str erlaubt. suffix und prefix akzeptieren nun und verwenden standardmäßig
None, um einen geeigneten Standardwert zu verwenden.Geändert in Version 3.6: Der Parameter dir akzeptiert nun ein pfadähnliches Objekt.
Geändert in Version 3.12:
mkdtemp()gibt jetzt immer einen absoluten Pfad zurück, auch wenn dir relativ ist.
- tempfile.gettempdir()¶
Gibt den Namen des Verzeichnisses zurück, das für temporäre Dateien verwendet wird. Dies definiert den Standardwert für das Argument dir für alle Funktionen in diesem Modul.
Python durchsucht eine Standardliste von Verzeichnissen, um eines zu finden, in dem der aufrufende Benutzer Dateien erstellen kann. Die Liste lautet
Das Verzeichnis, das durch die Umgebungsvariable
TMPDIRbenannt ist.Das Verzeichnis, das durch die Umgebungsvariable
TEMPbenannt ist.Das Verzeichnis, das durch die Umgebungsvariable
TMPbenannt ist.Ein plattformspezifischer Speicherort
Unter Windows die Verzeichnisse
C:\TEMP,C:\TMP,\TEMPund\TMP, in dieser Reihenfolge.Auf allen anderen Plattformen die Verzeichnisse
/tmp,/var/tmpund/usr/tmp, in dieser Reihenfolge.
Als letzte Möglichkeit das aktuelle Arbeitsverzeichnis.
Das Ergebnis dieser Suche wird zwischengespeichert, siehe Beschreibung von
tempdirunten.Geändert in Version 3.10: Gibt immer eine Zeichenkette zurück. Zuvor wurde jeder Wert von
tempdirunabhängig von seinem Typ zurückgegeben, solange er nichtNonewar.
- tempfile.gettempdirb()¶
Dasselbe wie
gettempdir(), aber der Rückgabewert ist in Bytes.Hinzugefügt in Version 3.5.
- tempfile.gettempprefix()¶
Gibt das für die Erstellung temporärer Dateien verwendete Dateinamenspräfix zurück. Dieses enthält nicht die Verzeichnungskomponente.
- tempfile.gettempprefixb()¶
Wie
gettempprefix(), aber der Rückgabewert ist in Bytes.Hinzugefügt in Version 3.5.
Das Modul verwendet eine globale Variable, um den Namen des Verzeichnisses für temporäre Dateien zu speichern, der von gettempdir() zurückgegeben wird. Diese kann direkt gesetzt werden, um den Auswahlprozess zu überschreiben, dies wird jedoch nicht empfohlen. Alle Funktionen in diesem Modul akzeptieren ein Argument dir, mit dem das Verzeichnis angegeben werden kann. Dies ist der empfohlene Ansatz, der kein anderes unachtsam geschriebenes Programm durch Ändern des globalen API-Verhaltens überrascht.
- tempfile.tempdir¶
Wenn dieser Wert auf etwas anderes als
Nonegesetzt ist, definiert diese Variable den Standardwert für das Argument dir für die in diesem Modul definierten Funktionen, einschließlich seines Typs (Bytes oder String). Es kann kein pfadähnliches Objekt sein.Wenn
tempdirbei einem Aufruf einer der obigen Funktionen außergettempprefix()gleichNoneist (Standard), wird es gemäß dem ingettempdir()beschriebenen Algorithmus initialisiert.Hinweis
Beachten Sie, dass die globale Standardrückgabe von
mkstemp()undmkdtemp()auf Bytes geändert wird, wenn Sietempdirauf einen Byte-Wert setzen. Dies geschieht, wenn keine expliziten String-Argumente fürprefix,suffixoderdirübergeben werden. Bitte schreiben Sie keinen Code, der dieses Verhalten erwartet oder davon abhängt. Dieses umständliche Verhalten wird aus Kompatibilitätsgründen mit der historischen Implementierung beibehalten.
Beispiele¶
Hier sind einige Beispiele für die typische Verwendung des Moduls tempfile
>>> import tempfile
# create a temporary file and write some data to it
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# read data from file
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# close the file, it will be removed
>>> fp.close()
# create a temporary file using a context manager
>>> with tempfile.TemporaryFile() as fp:
... fp.write(b'Hello world!')
... fp.seek(0)
... fp.read()
b'Hello world!'
>>>
# file is now closed and removed
# create a temporary file using a context manager
# close the file, use the name to open the file again
>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
... fp.write(b'Hello world!')
... fp.close()
... # the file is closed, but not removed
... # open the file again by using its name
... with open(fp.name, mode='rb') as f:
... f.read()
b'Hello world!'
>>>
# file is now removed
# create a temporary directory using the context manager
>>> with tempfile.TemporaryDirectory() as tmpdirname:
... print('created temporary directory', tmpdirname)
>>>
# directory and contents have been removed
Veraltete Funktionen und Variablen¶
Eine historische Methode zur Erstellung temporärer Dateien bestand darin, zuerst mit der Funktion mktemp() einen Dateinamen zu generieren und dann mit diesem Namen eine Datei zu erstellen. Leider ist dies nicht sicher, da ein anderer Prozess eine Datei mit diesem Namen erstellen könnte, bevor der erste Prozess versucht, die Datei zu erstellen. Die Lösung besteht darin, die beiden Schritte zu kombinieren und die Datei sofort zu erstellen. Dieser Ansatz wird von mkstemp() und den oben beschriebenen Funktionen verwendet.
- tempfile.mktemp(suffix='', prefix='tmp', dir=None)¶
Seit Version 2.3 veraltet: Verwenden Sie stattdessen
mkstemp().Gibt einen absoluten Pfad zu einer Datei zurück, die zum Zeitpunkt des Aufrufs nicht existierte. Die Argumente prefix, suffix und dir sind ähnlich wie bei
mkstemp(), mit der Ausnahme, dass Byte-Dateinamen sowiesuffix=Noneundprefix=Nonenicht unterstützt werden.Warnung
Die Verwendung dieser Funktion kann eine Sicherheitslücke in Ihrem Programm einführen. Bis zu dem Zeitpunkt, an dem Sie mit dem zurückgegebenen Dateinamen etwas tun, könnte jemand anderes Ihnen zuvorgekommen sein. Die Verwendung von
mktemp()kann einfach durchNamedTemporaryFile()ersetzt werden, indem der Parameterdelete=Falseübergeben wird.>>> f = NamedTemporaryFile(delete=False) >>> f.name '/tmp/tmptjujjt' >>> f.write(b"Hello World!\n") 13 >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) False