shutil
— Filoperationer på hög nivå¶
Källkod: Lib/shutil.py
Modulen shutil
erbjuder ett antal funktioner på hög nivå för filer och samlingar av filer. I synnerhet finns funktioner som stöder kopiering och borttagning av filer. För operationer på enskilda filer, se även modulen os
.
Varning
Inte ens filkopieringsfunktionerna på högre nivå (shutil.copy()
, shutil.copy2()
) kan kopiera alla filmetadata.
På POSIX-plattformar innebär detta att filägare och grupp försvinner, liksom ACL:er. På Mac OS används inte resursgaffeln och andra metadata. Det innebär att resurser går förlorade och att filtyp och skaparkod inte blir korrekta. På Windows kopieras inte filägare, ACL:er och alternativa dataströmmar.
Katalog- och filoperationer¶
- shutil.copyfileobj(fsrc, fdst[, length])¶
Kopierar innehållet i filliknande objekt fsrc till det filliknande objektet fdst. Heltalet length, om det anges, är buffertstorleken. Ett negativt length-värde innebär att data kopieras utan att källdata loopas i bitar; som standard läses data i bitar för att undvika okontrollerad minnesförbrukning. Observera att om den aktuella filpositionen för fsrc-objektet inte är 0, kommer endast innehållet från den aktuella filpositionen till slutet av filen att kopieras.
copyfileobj()
kommer inte att garantera att målströmmen har tömts när kopieringen är klar. Om du vill läsa från destinationen när kopieringen är klar (t.ex. läsa innehållet i en temporär fil som har kopierats från en HTTP-ström), måste du se till att du har anropatflush()
ellerclose()
på det filliknande objektet innan du försöker läsa destinationsfilen.
- shutil.copyfile(src, dst, *, follow_symlinks=True)¶
Kopiera innehållet (inga metadata) i filen med namnet src till en fil med namnet dst och returnera dst på effektivast möjliga sätt. src och dst är sökvägsliknande objekt eller sökvägsnamn angivna som strängar.
dst måste vara det fullständiga målfilsnamnet; se
copy()
för en kopiering som accepterar en målkatalogsökväg. Om src och dst anger samma fil, uppstårSameFileError
.Destinationsplatsen måste vara skrivbar, annars kommer ett
OSError
undantag att uppstå. Om dst redan finns kommer den att ersättas. Specialfiler som tecken- eller blockenheter och pipes kan inte kopieras med den här funktionen.Om follow_symlinks är false och src är en symbolisk länk, skapas en ny symbolisk länk i stället för att kopiera filen som src pekar på.
Utlöser en auditing event
shutil.copyfile
med argumentensrc
,dst
.Ändrad i version 3.3:
IOError
brukade visas istället förOSError
. Argumentet follow_symlinks lades till. Returnerar nu dst.Ändrad i version 3.4: Utlös
SameFileError
istället förError
. Eftersom den förra är en subklass av den senare är denna ändring bakåtkompatibel.Ändrad i version 3.8: Plattformsspecifika syscalls för snabbkopiering kan användas internt för att kopiera filen mer effektivt. Se avsnittet Plattformsberoende effektiva kopieringsoperationer.
- exception shutil.SameFileError¶
Detta undantag uppstår om källan och destinationen i
copyfile()
är samma fil.Tillagd i version 3.4.
- shutil.copymode(src, dst, *, follow_symlinks=True)¶
Kopiera behörighetsbitarna från src till dst. Filens innehåll, ägare och grupp påverkas inte. src och dst är sökvägsliknande objekt eller sökvägsnamn angivna som strängar. Om follow_symlinks är false och både src och dst är symboliska länkar, kommer
copymode()
att försöka ändra läget för dst själv (snarare än filen den pekar på). Denna funktion är inte tillgänglig på alla plattformar; secopystat()
för mer information. Omcopymode()
inte kan modifiera symboliska länkar på den lokala plattformen, och den ombeds att göra det, kommer den inte att göra någonting och returnera.Utlöser en auditing event
shutil.copymode
med argumentensrc
,dst
.Ändrad i version 3.3: Lagt till argumentet follow_symlinks.
- shutil.copystat(src, dst, *, follow_symlinks=True)¶
Kopierar behörighetsbitar, senaste åtkomsttid, senaste ändringstid och flaggor från src till dst. På Linux kopierar
copystat()
även de ”utökade attributen” där så är möjligt. Filinnehåll, ägare och grupp påverkas inte. src och dst är sökvägsliknande objekt eller sökvägsnamn angivna som strängar.Om follow_symlinks är false, och src och dst båda hänvisar till symboliska länkar, kommer
copystat()
att arbeta med de symboliska länkarna själva snarare än med de filer som de symboliska länkarna hänvisar till - läsa informationen från den symboliska länken src och skriva informationen till den symboliska länken dst.Anteckning
Det är inte alla plattformar som ger möjlighet att undersöka och ändra symboliska länkar. Python själv kan berätta vilken funktionalitet som är lokalt tillgänglig.
Om
os.chmod in os.supports_follow_symlinks
ärTrue
, kancopystat()
ändra behörighetsbitarna för en symbolisk länk.Om
os.utime in os.supports_follow_symlinks
ärTrue
, kancopystat()
ändra den senaste åtkomst- och ändringstiden för en symbolisk länk.Om
os.chflags in os.supports_follow_symlinks
ärTrue
kancopystat()
ändra flaggorna för en symbolisk länk. (os.chflags
är inte tillgänglig på alla plattformar)
På plattformar där en del av eller all denna funktionalitet inte är tillgänglig, kommer
copystat()
att kopiera allt den kan när den ombeds att ändra en symbolisk länk.copystat()
returnerar aldrig fel.Se
os.supports_follow_symlinks
för mer information.Utlöser en auditing event
shutil.copystat
med argumentensrc
,dst
.Ändrad i version 3.3: Argumentet follow_symlinks och stöd för Linux utökade attribut har lagts till.
- shutil.copy(src, dst, *, follow_symlinks=True)¶
Kopierar filen src till filen eller katalogen dst. src och dst bör vara path-liknande objekt eller strängar. Om dst anger en katalog kommer filen att kopieras till dst med hjälp av basfilnamnet från src. Om dst anger en fil som redan finns kommer den att ersättas. Returnerar sökvägen till den nyskapade filen.
Om follow_symlinks är false och src är en symbolisk länk kommer dst att skapas som en symbolisk länk. Om follow_symlinks är true och src är en symbolisk länk, blir dst en kopia av den fil som src hänvisar till.
copy()
kopierar filinformationen och filens behörighetsläge (seos.chmod()
). Andra metadata, t.ex. filens skapelse- och ändringstid, bevaras inte. Om du vill bevara alla filmetadata från originalet använder du iställetcopy2()
.Utlöser en auditing event
shutil.copyfile
med argumentensrc
,dst
.Utlöser en auditing event
shutil.copymode
med argumentensrc
,dst
.Ändrad i version 3.3: Lagt till argumentet follow_symlinks. Returnerar nu sökvägen till den nyskapade filen.
Ändrad i version 3.8: Plattformsspecifika syscalls för snabbkopiering kan användas internt för att kopiera filen mer effektivt. Se avsnittet Plattformsberoende effektiva kopieringsoperationer.
- shutil.copy2(src, dst, *, follow_symlinks=True)¶
Identisk med
copy()
förutom attcopy2()
också försöker bevara metadata för filer.När follow_symlinks är false och src är en symbolisk länk försöker
copy2()
att kopiera alla metadata från den symboliska länken src till den nyskapade symboliska länken dst. Denna funktion är dock inte tillgänglig på alla plattformar. På plattformar där hela eller delar av denna funktionalitet inte är tillgänglig kommercopy2()
att bevara alla metadata den kan;copy2()
ger aldrig upphov till ett undantag för att den inte kan bevara filmetadata.copy2()
användercopystat()
för att kopiera filens metadata. Secopystat()
för mer information om plattformsstöd för modifiering av metadata för symboliska länkar.Utlöser en auditing event
shutil.copyfile
med argumentensrc
,dst
.Utlöser en auditing event
shutil.copystat
med argumentensrc
,dst
.Ändrad i version 3.3: Lagt till follow_symlinks-argument, försök att kopiera utökade filsystemattribut också (för närvarande endast Linux). Returnerar nu sökvägen till den nyskapade filen.
Ändrad i version 3.8: Plattformsspecifika syscalls för snabbkopiering kan användas internt för att kopiera filen mer effektivt. Se avsnittet Plattformsberoende effektiva kopieringsoperationer.
- shutil.ignore_patterns(*patterns)¶
Denna fabriksfunktion skapar en funktion som kan användas som en anropbar funktion för
copytree()
’s ignore-argument, och ignorerar filer och kataloger som matchar ett av de mönster i glob-stil som anges. Se exemplet nedan.
- shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)¶
Kopiera rekursivt ett helt katalogträd med rot i src till en katalog med namnet dst och returnera destinationskatalogen. Alla mellanliggande kataloger som behövs för att innehålla dst kommer också att skapas som standard.
Behörigheter och tider för kataloger kopieras med
copystat()
, enskilda filer kopieras medcopy2()
.Om symlinks är true representeras symboliska länkar i källträdet som symboliska länkar i det nya trädet och metadata för de ursprungliga länkarna kopieras så långt som plattformen tillåter; om false eller utelämnas kopieras innehållet och metadata för de länkade filerna till det nya trädet.
När symlinks är false, om filen som symlänken pekar på inte finns, kommer ett undantag att läggas till i listan över fel som tas upp i ett
Error
-undantag i slutet av kopieringsprocessen. Du kan sätta den valfria flaggan ignore_dangling_symlinks till true om du vill tysta detta undantag. Observera att det här alternativet inte har någon effekt på plattformar som inte stöderos.symlink()
.Om ignore anges, måste det vara en anropbar funktion som får som argument den katalog som besöks av
copytree()
, och en lista över dess innehåll, som returneras avos.listdir()
. Eftersomcopytree()
anropas rekursivt, kommer anropet ignore att anropas en gång för varje katalog som kopieras. Anropet måste returnera en sekvens av katalog- och filnamn i förhållande till den aktuella katalogen (dvs. en delmängd av objekten i dess andra argument); dessa namn kommer sedan att ignoreras i kopieringsprocessen.ignore_patterns()
kan användas för att skapa ett sådant anrop som ignorerar namn baserade på glob-liknande mönster.Om ett eller flera undantag inträffar genereras ett
Error
med en lista över orsaker.Om copy_function anges måste det vara en anropsbar funktion som används för att kopiera varje fil. Den kommer att anropas med källsökvägen och destinationssökvägen som argument. Som standard används
copy2()
, men alla funktioner som stöder samma signatur (somcopy()
) kan användas.Om dirs_exist_ok är false (standard) och dst redan existerar, uppstår ett
FileExistsError
. Om dirs_exist_ok är true fortsätter kopieringen om den stöter på befintliga kataloger, och filer i dst-trädet skrivs över av motsvarande filer från src-trädet.Utlöser en auditing event
shutil.copytree
med argumentensrc
,dst
.Ändrad i version 3.2: Lagt till argumentet copy_function för att kunna tillhandahålla en anpassad kopieringsfunktion. Lagt till argumentet ignore_dangling_symlinks för att dämpa fel med dinglande symlänkar när symlinks är false.
Ändrad i version 3.3: Kopiera metadata när symlinks är false. Returnerar nu dst.
Ändrad i version 3.8: Plattformsspecifika syscalls för snabbkopiering kan användas internt för att kopiera filen mer effektivt. Se avsnittet Plattformsberoende effektiva kopieringsoperationer.
Ändrad i version 3.8: Parametern dirs_exist_ok har lagts till.
- shutil.rmtree(path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None)¶
Ta bort ett helt katalogträd; path måste peka på en katalog (men inte på en symbolisk länk till en katalog). Om ignore_errors är true ignoreras fel som uppstår vid misslyckade borttagningar; om false eller utelämnas hanteras sådana fel genom att anropa en hanterare som specificeras av onexc eller onerror eller, om båda utelämnas, sprids undantag till den som anropar.
Den här funktionen kan stödja sökvägar som är relativa till katalogbeskrivare.
Anteckning
På plattformar som stöder de nödvändiga fd-baserade funktionerna används som standard en version av
rmtree()
som är motståndskraftig mot symlänkattacker. På andra plattformar är implementeringen avrmtree()
känslig för en symlänk-attack: med rätt timing och omständigheter kan angripare manipulera symlinks i filsystemet för att radera filer som de annars inte skulle ha tillgång till. Program kan använda funktionsattributetrmtree.avoids_symlink_attacks
för att avgöra vilket fall som gäller.Om onexc anges måste det vara en callable som accepterar tre parametrar: funktion, sökväg och excinfo.
Den första parametern, function, är den funktion som orsakade undantaget; den beror på plattform och implementering. Den andra parametern, path, är det sökvägsnamn som skickas till function. Den tredje parametern, excinfo, är det undantag som uppstod. Undantag som orsakas av onexc kommer inte att fångas upp.
Den föråldrade onerror liknar onexc, förutom att den tredje parametern den tar emot är den tupel som returneras från
sys.exc_info()
.Se även
exempel på rmtree för ett exempel på hur man hanterar borttagningen av ett katalogträd som innehåller skrivskyddade filer.
Utlöser en auditing event
shutil.rmtree
med argumentenpath
,dir_fd
.Ändrad i version 3.3: Lagt till en version som är motståndskraftig mot symlink-attacker och som används automatiskt om plattformen stöder fd-baserade funktioner.
Ändrad i version 3.8: I Windows tas inte längre innehållet i en katalogövergång bort innan övergången tas bort.
Ändrad i version 3.11: Parametern dir_fd har lagts till.
Ändrad i version 3.12: Parametern onexc tillagd, onerror borttagen.
Ändrad i version 3.13:
rmtree()
ignorerar nuFileNotFoundError
-undantag för alla utom sökvägen på högsta nivån. Andra undantag änOSError
och underklasser tillOSError
sprids nu alltid till den som anropar.
- shutil.move(src, dst, copy_function=copy2)¶
Flytta rekursivt en fil eller katalog (src) till en annan plats och returnera destinationen.
Om dst är en befintlig katalog eller en symlänk till en katalog, flyttas src till den katalogen. Målsökvägen i den katalogen får inte redan existera.
Om dst redan finns men inte är en katalog kan den komma att skrivas över beroende på
os.rename()
semantik.Om destinationen finns i det aktuella filsystemet används
os.rename()
. Annars kopieras src till destinationen med hjälp av copy_function och tas sedan bort. Om det gäller symlinks skapas en ny symlink som pekar på målet för src som destination och src tas bort.Om copy_function anges måste det vara en anropsbar funktion som tar två argument, src och destinationen, och som kommer att användas för att kopiera src till destinationen om
os.rename()
inte kan användas. Om källan är en katalog anropascopytree()
som får copy_function. Standard copy_function ärcopy2()
. Genom att användacopy()
som copy_function kan flytten lyckas när det inte är möjligt att även kopiera metadata, på bekostnad av att inga metadata kopieras.Utlöser en auditing event
shutil.move
med argumentensrc
,dst
.Ändrad i version 3.3: Lade till explicit symlänkhantering för utländska filsystem och anpassade den därmed till beteendet i GNU:s mv. Returnerar nu dst.
Ändrad i version 3.5: Lagt till nyckelordsargumentet copy_function.
Ändrad i version 3.8: Plattformsspecifika syscalls för snabbkopiering kan användas internt för att kopiera filen mer effektivt. Se avsnittet Plattformsberoende effektiva kopieringsoperationer.
Ändrad i version 3.9: Accepterar en path-like object för både src och dst.
- shutil.disk_usage(path)¶
Returnerar diskanvändningsstatistik för den angivna sökvägen som en named tuple med attributen total, used och free, som är mängden totalt, använt och ledigt utrymme i byte. path kan vara en fil eller en katalog.
Anteckning
På Unix-filsystem måste path peka på en sökväg inom en monterad filsystemspartition. På dessa plattformar försöker CPython inte att hämta information om diskanvändning från icke monterade filsystem.
Tillagd i version 3.3.
Ändrad i version 3.8: I Windows kan path nu vara en fil eller katalog.
Tillgänglighet: Unix, Windows.
- shutil.chown(path, user=None, group=None, *, dir_fd=None, follow_symlinks=True)¶
Ändra ägare user och/eller group för den angivna path.
user kan vara ett systemanvändarnamn eller ett uid; samma sak gäller för group. Minst ett argument krävs.
Se även
os.chown()
, den underliggande funktionen.Utlöser en auditing-händelse
shutil.chown
med argumentenpath
,user
,group
.Tillgänglighet: Unix.
Tillagd i version 3.3.
Ändrad i version 3.13: Parametrarna dir_fd och follow_symlinks har lagts till.
- shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)¶
Returnerar sökvägen till en körbar fil som skulle köras om den angivna cmd anropades. Om ingen cmd skulle anropas returneras
None
.mode är en behörighetsmask som skickas till
os.access()
, som standard avgör den om filen finns och är körbar.path är en ”
PATH
-sträng” som anger de kataloger som ska sökas i, avgränsad avos.pathsep
. Om ingen path anges, läses miljövariabelnPATH
frånos.environ
, och faller tillbaka tillos.defpath
om den inte är inställd.Om cmd innehåller en katalogkomponent kontrollerar
which()
endast den angivna sökvägen direkt och söker inte i de kataloger som anges i path eller i systemets miljövariabelPATH
.I Windows prependlas den aktuella katalogen till path om mode inte innehåller
os.X_OK
. När mode innehålleros.X_OK
, kommer Windows APINeedCurrentDirectoryForExePathW
att konsulteras för att avgöra om den aktuella katalogen ska läggas till path. För att undvika att den aktuella arbetskatalogen konsulteras för körbara filer: ställ in miljövariabelnNoDefaultCurrentDirectoryInExePath
.I Windows används även miljövariabeln
PATHEXT
för att lösa kommandon som kanske inte redan innehåller ett tillägg. Om du till exempel anroparshutil.which("python")
, kommerwhich()
att söka iPATHEXT
för att veta att den ska leta efterpython.exe
i katalogerna path. Till exempel på Windows:>>> shutil.which("python") 'C:\\Python33\\python.EXE'
Detta gäller även när cmd är en sökväg som innehåller en katalogkomponent:
>>> shutil.which("C:\\Python33\\python") 'C:\\Python33\\python.EXE'
Tillagd i version 3.3.
Ändrad i version 3.8: Typen
bytes
accepteras nu. Om cmd-typen ärbytes
, är resultattypen ocksåbytes
.Ändrad i version 3.12: I Windows läggs inte längre den aktuella katalogen till i sökvägen om mode innehåller
os.X_OK
och WinAPINeedCurrentDirectoryForExePathW(cmd)
är false, annars läggs den aktuella katalogen till även om den redan finns i sökvägen;PATHEXT
används nu även när cmd innehåller en katalogkomponent eller slutar med ett tillägg som finns iPATHEXT
; och filnamn som inte har något tillägg kan nu hittas.
- exception shutil.Error¶
Detta undantag samlar in undantag som uppstår under en operation med flera filer. För
copytree()
är undantagsargumentet en lista med 3-tuples (srcname, dstname, exception).
Plattformsberoende effektiva kopieringsoperationer¶
Från och med Python 3.8 kan alla funktioner som involverar en filkopiering (copyfile()
, copy()
, copy2()
, copytree()
, och move()
) använda plattformsspecifika ”fast-copy” syscalls för att kopiera filen mer effektivt (se bpo-33671). ”Fast-copy” innebär att kopieringsoperationen sker i kärnan, vilket undviker användning av userspace-buffertar i Python som i ”outfd.write(infd.read())
”.
På macOS används fcopyfile för att kopiera filinnehållet (inte metadata).
På Linux används os.copy_file_range()
eller os.sendfile()
.
På Solaris används os.sendfile()
.
I Windows använder shutil.copyfile()
en större standardbuffertstorlek (1 MiB istället för 64 KiB) och en memoryview()
-baserad variant av shutil.copyfileobj()
används.
Om snabbkopieringen misslyckas och inga data skrevs i målfilen kommer shutil att tyst fallbacka till att använda den mindre effektiva copyfileobj()
-funktionen internt.
Ändrad i version 3.8.
Ändrad i version 3.14: Solaris använder nu os.sendfile()
.
Ändrad i version 3.14: Copy-on-write eller kopiering på serversidan kan användas internt via os.copy_file_range()
på Linux-filsystem som stöds.
exempel på copytree¶
Ett exempel som använder hjälpen ignore_patterns()
:
from shutil import copytree, ignore_patterns
copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
Detta kopierar allt utom .pyc
-filer och filer eller kataloger vars namn börjar med tmp
.
Ett annat exempel som använder ignore-argumentet för att lägga till ett loggningsanrop:
from shutil import copytree
import logging
def _logpath(path, names):
logging.info('Working in %s', path)
return [] # nothing will be ignored
copytree(source, destination, ignore=_logpath)
exempel på rmtree¶
Det här exemplet visar hur man tar bort ett katalogträd i Windows där vissa av filerna har skrivskyddad bit inställd. Det använder onexc callback för att rensa den skrivskyddade biten och göra ett nytt försök att ta bort. Eventuella efterföljande fel kommer att sprida sig.
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onexc=remove_readonly)
Arkiveringsverksamhet¶
Tillagd i version 3.2.
Ändrad i version 3.5: Stöd för formatet xztar har lagts till.
Verktyg på hög nivå för att skapa och läsa komprimerade och arkiverade filer tillhandahålls också. De förlitar sig på modulerna zipfile
och tarfile
.
- shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])¶
Skapa en arkivfil (t.ex. zip eller tar) och ange dess namn.
base_name är namnet på den fil som ska skapas, inklusive sökvägen, minus eventuella formatspecifika tillägg.
format är arkivformatet: ett av följande: ”zip” (om modulen
zlib
finns tillgänglig), ”tar”, ”gztar” (om modulenzlib
finns tillgänglig), ”bztar” (om modulenbz2
finns tillgänglig), ”xztar” (om modulenlzma
finns tillgänglig) eller ”zstdtar” (om modulencompression.zstd
finns tillgänglig).root_dir är en katalog som kommer att vara arkivets rotkatalog, alla sökvägar i arkivet kommer att vara relativa till den; vi brukar t.ex. chdir:a till root_dir innan vi skapar arkivet.
base_dir är den katalog där vi börjar arkivera från, dvs. base_dir kommer att vara det gemensamma prefixet för alla filer och kataloger i arkivet. base_dir måste anges i förhållande till root_dir. Se Exempel på arkivering med base_dir för hur man använder base_dir och root_dir tillsammans.
root_dir och base_dir är båda förvalda till den aktuella katalogen.
Om dry_run är true skapas inget arkiv, men de operationer som skulle ha utförts loggas i logger.
owner och group används när ett tar-arkiv skapas. Som standard används den aktuella ägaren och gruppen.
logger måste vara ett objekt som är kompatibelt med PEP 282, vanligtvis en instans av
logging.Logger
.Argumentet verbose är oanvänt och föråldrat.
Utlöser en auditing-händelse
shutil.make_archive
med argumentenbase_name
,format
,root_dir
,base_dir
.Anteckning
Den här funktionen är inte trådsäker när anpassade arkiverare som registrerats med
register_archive_format()
inte stöder argumentet root_dir. I så fall ändras processens aktuella arbetskatalog tillfälligt till root_dir för att utföra arkivering.Ändrad i version 3.8: Det moderna pax-formatet (POSIX.1-2001) används nu i stället för det äldre GNU-formatet för arkiv som skapats med
format="tar"
.Ändrad i version 3.10.6: Denna funktion är nu trådsäker under skapandet av standardarkiv av typen
.zip
och tar.
- shutil.get_archive_formats()¶
Returnerar en lista över format som stöds för arkivering. Varje element i den returnerade sekvensen är en tupel
(namn, beskrivning)
.Som standard tillhandahåller
shutil
dessa format:zip: ZIP-fil (om modulen
zlib
är tillgänglig).tar: Okomprimerad tar-fil. Använder POSIX.1-2001 pax-format för nya arkiv.
gztar: gzip’ed tar-fil (om modulen
zlib
är tillgänglig).bztar: bzip2-behandlad tar-fil (om modulen
bz2
är tillgänglig).xztar: xz’ed tar-fil (om modulen
lzma
är tillgänglig).zstdtar: Zstandardkomprimerad tar-fil (om modulen
compression.zstd
är tillgänglig).
Du kan registrera nya format eller tillhandahålla din egen arkiverare för befintliga format genom att använda
register_archive_format()
.
- shutil.register_archive_format(name, function[, extra_args[, description]])¶
Registrera en arkiverare för formatet namn.
function är den anropbara funktion som kommer att användas för att packa upp arkiv. Anropsfunktionen tar emot base_name för filen som ska skapas, följt av base_dir (som standard är
os.curdir
) för att starta arkiveringen från. Ytterligare argument skickas som nyckelordsargument: owner, group, dry_run och logger (som skickas imake_archive()
).Om function har det anpassade attributet
function.supports_root_dir
inställt påTrue
, skickas root_dir-argumentet som ett nyckelordsargument. Annars ändras processens aktuella arbetskatalog tillfälligt till root_dir innan function anropas. I det här fallet ärmake_archive()
inte trådsäker.Om extra_args anges är det en sekvens av par av
(namn, värde)
som kommer att användas som extra nyckelordsargument när arkiverarens anropsbarhet används.description används av
get_archive_formats()
som returnerar en lista över arkivbildare. Standardvärdet är en tom sträng.Ändrad i version 3.12: Lagt till stöd för funktioner som stöder argumentet root_dir.
- shutil.unregister_archive_format(name)¶
Ta bort arkivformatet name från listan över format som stöds.
- shutil.unpack_archive(filename[, extract_dir[, format[, filter]]])¶
Packa upp ett arkiv. filnamn är den fullständiga sökvägen till arkivet.
extract_dir är namnet på den målkatalog där arkivet ska packas upp. Om det inte anges används den aktuella arbetskatalogen.
format är arkivformatet: ett av ”zip”, ”tar”, ”gztar”, ”bztar”, ”xztar” eller ”zstdtar”. Eller något annat format som registrerats med
register_unpack_format()
. Om inget anges kommerunpack_archive()
att använda arkivets filnamnstillägg och se om en uppackare har registrerats för det tillägget. Om ingen hittas, kommer ettValueError
att uppstå.Argumentet filter, som endast innehåller nyckelord, skickas till den underliggande uppackningsfunktionen. För zip-filer accepteras inte filter. För tar-filer rekommenderas det att använda
'data'
(standard sedan Python 3.14), såvida man inte använder funktioner som är specifika för tar och UNIX-liknande filsystem. (Se Filter för utsugning för detaljer)Utlöser en auditing event
shutil.unpack_archive
med argumentenfilename
,extract_dir
,format
.Varning
Extrahera aldrig arkiv från otillförlitliga källor utan föregående inspektion. Det är möjligt att filer skapas utanför den sökväg som anges i argumentet extract_dir, t.ex. medlemmar som har absoluta filnamn som börjar med ”/” eller filnamn med två punkter ”…”.
Sedan Python 3.14 kommer standardinställningarna för båda de inbyggda formaten (zip- och tar-filer) att förhindra de farligaste av sådana säkerhetsproblem, men kommer inte att förhindra alla oavsiktliga beteenden. Läs avsnittet Tips för ytterligare verifiering för tar-specifika detaljer.
Ändrad i version 3.7: Accepterar en path-like object för filename och extract_dir.
Ändrad i version 3.12: Lagt till argumentet filter.
- shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])¶
Registrerar ett uppackningsformat. name är namnet på formatet och extensions är en lista med tillägg som motsvarar formatet, t.ex.
.zip
för Zip-filer.function är den anropbara funktion som kommer att användas för att packa upp arkiv. Den anropsbara funktionen kommer att ta emot:
sökvägen till arkivet, som ett positionellt argument;
den katalog som arkivet måste extraheras till, som ett positionellt argument;
eventuellt ett filter nyckelordsargument, om det gavs till
unpack_archive()
;ytterligare nyckelordsargument, specificerade av extra_args som en sekvens av
(namn, värde)
-tupler.
description kan anges för att beskriva formatet och kommer att returneras av funktionen
get_unpack_formats()
.
- shutil.unregister_unpack_format(name)¶
Avregistrera ett uppackningsformat. name är namnet på formatet.
- shutil.get_unpack_formats()¶
Returnerar en lista över alla registrerade format för uppackning. Varje element i den returnerade sekvensen är en tupel
(name, extensions, description)
.Som standard tillhandahåller
shutil
dessa format:zip: ZIP-fil (uppackning av komprimerade filer fungerar endast om motsvarande modul finns tillgänglig).
tar: okomprimerad tar-fil.
gztar: gzip’ed tar-fil (om modulen
zlib
är tillgänglig).bztar: bzip2-behandlad tar-fil (om modulen
bz2
är tillgänglig).xztar: xz’ed tar-fil (om modulen
lzma
är tillgänglig).zstdtar: Zstandardkomprimerad tar-fil (om modulen
compression.zstd
är tillgänglig).
Du kan registrera nya format eller tillhandahålla din egen uppackare för befintliga format genom att använda
register_unpack_format()
.
Exempel på arkivering¶
I det här exemplet skapar vi ett gzip-komprimerat tar-filarkiv som innehåller alla filer som finns i .ssh
-katalogen för användaren:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
Det resulterande arkivet innehåller:
$ tar -tzvf /Users/tarek/myarchive.tar.gz
drwx------ tarek/staff 0 2010-02-01 16:23:40 ./
-rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys
-rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config
-rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa
-rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub
-rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa
-rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub
-rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts
Exempel på arkivering med base_dir¶
I det här exemplet, som liknar exemplet ovan, visar vi hur man använder make_archive()
, men den här gången med base_dir. Vi har nu följande katalogstruktur:
$ tree tmp
tmp
└── root
└── structure
├── content
└── please_add.txt
└── do_not_add.txt
I det slutliga arkivet ska please_add.txt
ingå, men do_not_add.txt
ska inte ingå. Därför använder vi följande:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
... archive_name,
... 'tar',
... root_dir='tmp/root',
... base_dir='structure/content',
... )
'/Users/tarek/my_archive.tar'
En lista över filerna i det resulterande arkivet ger oss:
$ python -m tarfile -l /Users/tarek/myarchive.tar
structure/content/
structure/content/please_add.txt
Fråga om storleken på utdataterminalen¶
- shutil.get_terminal_size(fallback=(columns, lines))¶
Hämta storleken på terminalfönstret.
För var och en av de två dimensionerna kontrolleras miljövariabeln
COLUMNS
respektiveLINES
. Om variabeln är definierad och värdet är ett positivt heltal används den.När
COLUMNS
ellerLINES
inte är definierade, vilket är det vanliga fallet, frågas terminalen som är ansluten tillsys.__stdout__
genom att anropaos.get_terminal_size()
.Om det inte går att fråga efter terminalstorleken, antingen för att systemet inte stöder en sådan fråga eller för att vi inte är anslutna till en terminal, används det värde som anges i parametern
fallback
. standardvärdet förfallback
är(80, 24)
, vilket är den standardstorlek som används av många terminalemulatorer.Det värde som returneras är en namngiven tupel av typen
os.terminal_size
.Se även: The Single UNIX Specification, Version 2, Other Environment Variables.
Tillagd i version 3.3.
Ändrad i version 3.11:
fallback
-värdena används också omos.get_terminal_size()
returnerar noll.