tempfile
— Skapa temporära filer och kataloger¶
Källkod: Lib/tempfile.py
Den här modulen skapar temporära filer och kataloger. Den fungerar på alla plattformar som stöds. TemporaryFile
, NamedTemporaryFile
, TemporaryDirectory
och SpooledTemporaryFile
är högnivågränssnitt som ger automatisk rensning och kan användas som kontexthanterare. mkstemp()
och mkdtemp()
är funktioner på lägre nivå som kräver manuell rensning.
Alla funktioner och konstruktörer som kan anropas av användaren tar ytterligare argument som ger direkt kontroll över platsen för och namnet på temporära filer och kataloger. Filnamn som används av denna modul innehåller en sträng med slumpmässiga tecken som gör att dessa filer kan skapas på ett säkert sätt i delade temporära kataloger. För att upprätthålla bakåtkompatibilitet är argumentordningen något udda; det rekommenderas att använda nyckelordsargument för tydlighetens skull.
Modulen definierar följande användaranropsbara objekt:
- tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Returnerar ett filliknande objekt som kan användas som ett tillfälligt lagringsutrymme. Filen skapas på ett säkert sätt med samma regler som
mkstemp()
. Den kommer att förstöras så snart den stängs (inklusive en implicit stängning när objektet garbage collected). Under Unix skapas antingen inte katalogposten för filen alls eller så tas den bort omedelbart efter att filen har skapats. Andra plattformar stöder inte detta; din kod bör inte förlita sig på att en temporär fil som skapats med denna funktion har eller inte har ett synligt namn i filsystemet.Det resulterande objektet kan användas som en kontexthanterare (se Exempel). När kontexten är klar eller filobjektet förstörs kommer den temporära filen att tas bort från filsystemet.
Parametern mode är som standard inställd på
'w+b'
så att den fil som skapas kan läsas och skrivas utan att stängas. Binary mode används så att den beter sig konsekvent på alla plattformar utan hänsyn till vilka data som lagras. buffring, kodning, fel och ny linje tolkas som föropen()
.Parametrarna dir, prefix och suffix har samma betydelse och standardvärden som i
mkstemp()
.Det returnerade objektet är ett äkta filobjekt på POSIX-plattformar. På andra plattformar är det ett filliknande objekt vars
file
-attribut är det underliggande äkta filobjektet.Flaggan
os.O_TMPFILE
används om den är tillgänglig och fungerar (Linux-specifik, kräver Linux-kärnan 3.11 eller senare).På plattformar som varken är Posix eller Cygwin är TemporaryFile ett alias för NamedTemporaryFile.
Utlöser en auditing event
tempfile.mkstemp
med argumentetfullpath
.Ändrad i version 3.5: Flaggan
os.O_TMPFILE
används nu om den är tillgänglig.Ändrad i version 3.8: Lagt till parametern errors.
- 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)¶
Den här funktionen fungerar precis som
TemporaryFile()
, med undantag för följande skillnader:Denna funktion returnerar en fil som garanterat har ett synligt namn i filsystemet.
För att hantera den namngivna filen utökas parametrarna i
TemporaryFile()
med parametrarna delete och delete_on_close som avgör om och hur den namngivna filen ska raderas automatiskt.
Det returnerade objektet är alltid ett filliknande objekt vars
file
-attribut är det underliggande riktiga filobjektet. Detta filliknande objekt kan användas i enwith
-sats, precis som en vanlig fil. Namnet på den temporära filen kan hämtas från attributetname
i det returnerade filliknande objektet. På Unix, till skillnad från medTemporaryFile()
, blir inte katalogposten avlänkad omedelbart efter att filen skapats.Om delete är true (standard) och delete_on_close är true (standard) raderas filen så snart den har stängts. Om delete är true och delete_on_close är false raderas filen endast när kontexthanteraren avslutas, eller när file-like object avslutas. Radering är inte alltid garanterad i detta fall (se
object.__del__()
). Om delete är false ignoreras värdet för delete_on_close.Om du vill använda namnet på den temporära filen för att öppna filen igen efter att ha stängt den måste du antingen se till att inte radera filen vid stängning (ange att parametern delete ska vara false) eller, om den temporära filen skapas i en
with
-sats, ange att parametern delete_on_close ska vara false. Den senare metoden rekommenderas eftersom den hjälper till att automatiskt rensa den temporära filen när kontexthanteraren avslutas.Att öppna den tillfälliga filen igen med dess namn medan den fortfarande är öppen fungerar på följande sätt:
På POSIX kan filen alltid öppnas igen.
I Windows ska du kontrollera att minst ett av följande villkor är uppfyllt:
delete är falskt
ytterligare öppna aktier radera åtkomst (t.ex. genom att anropa
os.open()
med flagganO_TEMPORARY
)delete är sant men delete_on_close är falskt. Observera att i detta fall måste de ytterligare öppningar som inte delar delete-åtkomst (t.ex. skapade via inbyggda
open()
) stängas innan kontexthanteraren avslutas, annars kommeros.unlink()
-anropet vid kontexthanterarens avslutning att misslyckas med ettPermissionError
.
I Windows, om delete_on_close är false och filen skapas i en katalog som användaren saknar delete-åtkomst till, kommer
os.unlink()
-anropet vid avslutning av kontexthanteraren att misslyckas medPermissionError
. Detta kan inte hända när delete_on_close är true eftersom delete-åtkomst begärs av open, som misslyckas omedelbart om den begärda åtkomsten inte beviljas.På POSIX (endast) kan en process som avslutas abrupt med SIGKILL inte automatiskt ta bort NamedTemporaryFiles som den har skapat.
Utlöser en auditing event
tempfile.mkstemp
med argumentetfullpath
.Ändrad i version 3.8: Lagt till parametern errors.
Ändrad i version 3.12: Lagt till parametern delete_on_close.
- class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
Den här klassen fungerar precis som
TemporaryFile()
, förutom att data spolas i minnet tills filstorleken överstiger max_size, eller tills filensfileno()
-metod anropas, varvid innehållet skrivs till disken och operationen fortsätter som medTemporaryFile()
.- rollover()¶
Den resulterande filen har ytterligare en metod,
rollover()
, som gör att filen rullas över till en fil på disken oavsett dess storlek.
Det returnerade objektet är ett filliknande objekt vars attribut
_file
är antingen ettio.BytesIO
- ellerio.TextIOWrapper
-objekt (beroende på om binärt eller text mode specificerades) eller ett äkta filobjekt, beroende på omrollover()
har anropats. Detta filliknande objekt kan användas i enwith
-sats, precis som en vanlig fil.Ändrad i version 3.3: trunkeringsmetoden accepterar nu ett size-argument.
Ändrad i version 3.8: Lagt till parametern errors.
Ändrad i version 3.11: Implementerar fullständigt de abstrakta basklasserna
io.BufferedIOBase
ochio.TextIOBase
(beroende på om binärt eller text mode angavs).
- class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)¶
Denna klass skapar en temporär katalog på ett säkert sätt med samma regler som
mkdtemp()
. Det resulterande objektet kan användas som en kontexthanterare (se Exempel). När kontexten är klar eller när objektet för den temporära katalogen förstörs, tas den nyskapade temporära katalogen och allt dess innehåll bort från filsystemet.- name¶
Katalognamnet kan hämtas från attributet
name
i det returnerade objektet. När det returnerade objektet används som en context manager, kommername
att tilldelas målet föras
klausulen iwith
uttalandet, om det finns ett sådant.
- cleanup()¶
Katalogen kan uttryckligen rensas upp genom att anropa metoden
cleanup()
. Om ignore_cleanup_errors är true, kommer alla ohanterade undantag under explicit eller implicit rensning (t.ex. ettPermissionError
som tar bort öppna filer i Windows) att ignoreras, och de återstående flyttbara objekten kommer att raderas på ”bästa möjliga” sätt. I annat fall kommer fel att uppstå i det sammanhang där rensningen sker (anropetcleanup()
, när kontexthanteraren avslutas, när objektet samlas in eller när tolken stängs av).
Parametern delete kan användas för att inaktivera rensning av katalogträdet när kontexten avslutas. Även om det kan verka ovanligt att en kontexthanterare inaktiverar den åtgärd som vidtas när kontexten avslutas, kan det vara användbart vid felsökning eller när du vill att rensningsbeteendet ska vara villkorligt baserat på annan logik.
Utlöser en auditing event
tempfile.mkdtemp
med argumentetfullpath
.Tillagd i version 3.2.
Ändrad i version 3.10: Lagt till parametern ignore_cleanup_errors.
Ändrad i version 3.12: Lagt till parametern delete.
- tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)¶
Skapar en temporär fil på det säkraste sättet som är möjligt. Det finns inga tävlingsförhållanden i skapandet av filen, förutsatt att plattformen korrekt implementerar flaggan
os.O_EXCL
föros.open()
. Filen är läsbar och skrivbar endast av det skapande användar-ID:t. Om plattformen använder behörighetsbitar för att ange om en fil är körbar, är filen inte körbar av någon. Filens deskriptor ärvs inte av underordnade processer.Till skillnad från
TemporaryFile()
är användaren avmkstemp()
ansvarig för att radera den temporära filen när den är klar.Om suffix inte är
None
, kommer filnamnet att sluta med det suffixet, annars kommer det inte att finnas något suffix.mkstemp()
sätter inte en punkt mellan filnamnet och suffixet; om du behöver en, sätt den i början av suffix.Om prefix inte är
None
kommer filnamnet att börja med det prefixet, annars används ett standardprefix. Standardvärdet är returvärdet förgettempprefix()
ellergettempprefixb()
, beroende på vad som är lämpligt.Om dir inte är
None
kommer filen att skapas i den katalogen, annars används en standardkatalog. Standardkatalogen väljs från en plattformsberoende lista, men användaren av programmet kan styra katalogplatsen genom att ange miljövariablerna TMPDIR, TEMP eller TMP. Det finns därför ingen garanti för att det genererade filnamnet kommer att ha några bra egenskaper, som t.ex. att inte kräva citattecken när det skickas till externa kommandon viaos.popen()
.Om något av suffix, prefix och dir inte är
None
måste de vara av samma typ. Om de är bytes kommer det returnerade namnet att vara bytes istället för str. Om du vill tvinga fram ett bytes-returvärde med annat standardbeteende, skickauffix=b''
.Om text anges och true, öppnas filen i textläge. I annat fall (standard) öppnas filen i binärt läge.
mkstemp()
returnerar en tupel som innehåller ett OS-nivåhandtag till en öppen fil (som skulle returneras avos.open()
) och det absoluta sökvägsnamnet för den filen, i den ordningen.Utlöser en auditing event
tempfile.mkstemp
med argumentetfullpath
.Ändrad i version 3.5: suffix, prefix och dir kan nu anges i bytes för att få ett bytes-returvärde. Tidigare var endast str tillåtet. suffix och prefix accepterar nu och är standard för
None
för att ett lämpligt standardvärde ska användas.Ändrad i version 3.6: Parametern dir accepterar nu en path-like object.
- tempfile.mkdtemp(suffix=None, prefix=None, dir=None)¶
Skapar en tillfällig katalog på säkrast möjliga sätt. Det finns inga tävlingsvillkor i skapandet av katalogen. Katalogen är läsbar, skrivbar och sökbar endast av det skapande användar-ID:t.
Användaren av
mkdtemp()
är ansvarig för att radera den temporära katalogen och dess innehåll när den är klar.Argumenten prefix, suffix och dir är desamma som för
mkstemp()
.mkdtemp()
returnerar det absoluta sökvägsnamnet för den nya katalogen.Utlöser en auditing event
tempfile.mkdtemp
med argumentetfullpath
.Ändrad i version 3.5: suffix, prefix och dir kan nu anges i bytes för att få ett bytes-returvärde. Tidigare var endast str tillåtet. suffix och prefix accepterar nu och är standard för
None
för att ett lämpligt standardvärde ska användas.Ändrad i version 3.6: Parametern dir accepterar nu en path-like object.
Ändrad i version 3.12:
mkdtemp()
returnerar nu alltid en absolut sökväg, även om dir är relativ.
- tempfile.gettempdir()¶
Returnerar namnet på den katalog som används för temporära filer. Detta definierar standardvärdet för argumentet dir för alla funktioner i denna modul.
Python söker igenom en standardlista med kataloger för att hitta en katalog som den anropande användaren kan skapa filer i. Listan är följande:
Den katalog som anges av miljövariabeln
TMPDIR
.Den katalog som anges av miljövariabeln
TEMP
.Den katalog som anges av miljövariabeln
TMP
.En plattformsspecifik plats:
I Windows, katalogerna
C:\TEMP
,C:\TMP
,\TEMP
och\TMP
, i den ordningen.På alla andra plattformar, katalogerna
/tmp
,/var/tmp
och/usr/tmp
, i nämnd ordning.
Som en sista utväg, den aktuella arbetskatalogen.
Resultatet av denna sökning cachelagras, se beskrivningen av
tempdir
nedan.Ändrad i version 3.10: Returnerar alltid en str. Tidigare returnerade den alla
tempdir
-värden oavsett typ så länge det inte varNone
.
- tempfile.gettempdirb()¶
Samma som
gettempdir()
men returvärdet är i bytes.Tillagd i version 3.5.
- tempfile.gettempprefix()¶
Returnerar det filnamnsprefix som används för att skapa temporära filer. Detta innehåller inte katalogkomponenten.
- tempfile.gettempprefixb()¶
Samma som
gettempprefix()
men returvärdet är i bytes.Tillagd i version 3.5.
Modulen använder en global variabel för att lagra namnet på den katalog som används för temporära filer som returneras av gettempdir()
. Den kan ställas in direkt för att åsidosätta urvalsprocessen, men detta avråds. Alla funktioner i den här modulen tar ett dir-argument som kan användas för att ange katalogen. Detta är det rekommenderade tillvägagångssättet som inte överraskar annan intet ont anande kod genom att ändra det globala API-beteendet.
- tempfile.tempdir¶
När den här variabeln anges till ett annat värde än
None
definierar den standardvärdet för dir-argumentet till de funktioner som definieras i den här modulen, inklusive dess typ, bytes eller str. Det kan inte vara ett path-like object.Om
tempdir
ärNone
(standard) vid något anrop till någon av ovanstående funktioner utomgettempprefix()
initialiseras den enligt algoritmen som beskrivs igettempdir()
.Anteckning
Tänk på att om du sätter
tempdir
till ett bytes-värde, så finns det en otäck bieffekt: Den globala standardreturtypen förmkstemp()
ochmkdtemp()
ändras till bytes när inga explicitaprefix
,suffix
ellerdir
-argument av typen str anges. Skriv inte kod som förväntar sig eller är beroende av detta. Detta besvärliga beteende bibehålls för kompatibilitet med den historiska implementationen.
Exempel¶
Här följer några exempel på typisk användning av modulen 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
Föråldrade funktioner och variabler¶
Ett historiskt sätt att skapa temporära filer var att först generera ett filnamn med funktionen mktemp()
och sedan skapa en fil med detta namn. Tyvärr är detta inte säkert, eftersom en annan process kan skapa en fil med detta namn under tiden mellan anropet till mktemp()
och det efterföljande försöket att skapa filen av den första processen. Lösningen är att kombinera de två stegen och skapa filen omedelbart. Detta tillvägagångssätt används av mkstemp()
och de andra funktionerna som beskrivs ovan.
- tempfile.mktemp(suffix='', prefix='tmp', dir=None)¶
Föråldrad sedan version 2.3: Använd
mkstemp()
istället.Returnerar ett absolut sökvägsnamn för en fil som inte fanns när anropet gjordes. Argumenten prefix, suffix och dir liknar argumenten i
mkstemp()
, förutom att filnamn för byte,suffix=None
ochprefix=None
inte stöds.Varning
Om du använder den här funktionen kan du få ett säkerhetshål i ditt program. När du väl hinner göra något med filnamnet som returneras, kan någon annan ha hunnit före dig.
mktemp()
kan enkelt ersättas medNamedTemporaryFile()
, med parameterndelete=False
:>>> 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