zipfile
— Arbeta med ZIP-arkiv¶
Källkod: Lib/zipfile/
ZIP-filformatet är en vanlig standard för arkivering och komprimering. Den här modulen innehåller verktyg för att skapa, läsa, skriva, lägga till och lista en ZIP-fil. För att kunna använda den här modulen på ett avancerat sätt måste du förstå formatet, enligt definitionen i PKZIP Application Note.
Denna modul hanterar för närvarande inte ZIP-filer med flera diskar. Den kan hantera ZIP-filer som använder ZIP64-tilläggen (dvs. ZIP-filer som är större än 4 GiB). Den stöder dekryptering av krypterade filer i ZIP-arkiv, men den kan för närvarande inte skapa en krypterad fil. Dekrypteringen är extremt långsam eftersom den är implementerad i Python istället för C.
Modulen definierar följande punkter:
- exception zipfile.BadZipFile¶
Felmeddelandet för dåliga ZIP-filer.
Tillagd i version 3.2.
- exception zipfile.BadZipfile¶
Alias för
BadZipFile
, för kompatibilitet med äldre Python-versioner.Föråldrad sedan version 3.2.
- exception zipfile.LargeZipFile¶
Felet uppstod när en ZIP-fil skulle kräva ZIP64-funktionalitet, men den har inte aktiverats.
- class zipfile.ZipFile
Klassen för att läsa och skriva ZIP-filer. Se avsnitt ZipFile-objekt för detaljer om konstruktören.
- class zipfile.Path
Klass som implementerar en delmängd av det gränssnitt som tillhandahålls av
pathlib.Path
, inklusive det fullständigaimportlib.resources.abc.Traversable
-gränssnittet.Tillagd i version 3.8.
- class zipfile.PyZipFile
Klass för att skapa ZIP-arkiv som innehåller Python-bibliotek.
- class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))¶
Klass som används för att representera information om en medlem i ett arkiv. Instanser av denna klass returneras av metoderna
getinfo()
ochinfolist()
förZipFile
-objekt. De flesta användare av modulenzipfile
behöver inte skapa dessa, utan använder bara de som skapats av denna modul. filename bör vara det fullständiga namnet på arkivmedlemmen och date_time bör vara en tupel som innehåller sex fält som beskriver tidpunkten för den senaste ändringen av filen; fälten beskrivs i avsnitt ZipInfo-objekt.Ändrad i version 3.13: Ett publikt attribut
compress_level
har lagts till för att exponera det tidigare skyddade attributet_compresslevel
. Det äldre skyddade namnet fortsätter att fungera som en egenskap för bakåtkompatibilitet.- _for_archive(archive)¶
Återställ date_time, komprimeringsattributen och de externa attributen till lämpliga standardvärden som används av
ZipFile.writestr()
.Returnerar själv för kedjekoppling.
Tillagd i version 3.14.
- zipfile.is_zipfile(filename)¶
Returnerar
True
om filnamn är en giltig ZIP-fil baserat på dess magiska nummer, annars returnerasFalse
. filename kan också vara en fil eller ett filliknande objekt.Ändrad i version 3.1: Stöd för filer och filliknande objekt.
- zipfile.ZIP_STORED¶
Den numeriska konstanten för en okomprimerad arkivmedlem.
- zipfile.ZIP_DEFLATED¶
Den numeriska konstanten för den vanliga ZIP-komprimeringsmetoden. Detta kräver modulen
zlib
.
- zipfile.ZIP_BZIP2¶
Den numeriska konstanten för komprimeringsmetoden BZIP2. Detta kräver modulen
bz2
.Tillagd i version 3.3.
- zipfile.ZIP_LZMA¶
Den numeriska konstanten för komprimeringsmetoden LZMA. Detta kräver modulen
lzma
.Tillagd i version 3.3.
- zipfile.ZIP_ZSTANDARD¶
Den numeriska konstanten för Zstandard-komprimering. Detta kräver modulen
compression.zstd
.Anteckning
I APPNOTE 6.3.7 tilldelades metod-ID
20
till Zstandard-komprimering. Detta ändrades i APPNOTE 6.3.8 till metod-ID93
för att undvika konflikter, med metod-ID20
som föråldrat. För kompatibilitet läser modulenzipfile
båda metod-ID:n men skriver endast data med metod-ID93
.Tillagd i version 3.14.
Anteckning
ZIP-filformatspecifikationen har inkluderat stöd för bzip2-komprimering sedan 2001, för LZMA-komprimering sedan 2006 och Zstandard-komprimering sedan 2020. Vissa verktyg (inklusive äldre Python-utgåvor) stöder dock inte dessa komprimeringsmetoder och kan antingen vägra att bearbeta ZIP-filen helt och hållet eller misslyckas med att extrahera enskilda filer.
Se även
- PKZIP Tillämpningsanvisning
Dokumentation om ZIP-filformatet av Phil Katz, skaparen av formatet och algoritmerna som används.
- Info-ZIP webbplats
Information om Info-ZIP-projektets ZIP-arkivprogram och utvecklingsbibliotek.
ZipFile-objekt¶
- class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)¶
Öppna en ZIP-fil, där fil kan vara en sökväg till en fil (en sträng), ett filliknande objekt eller en path-like object.
Parametern mode bör vara
'r'
för att läsa en befintlig fil,'w'
för att trunkera och skriva en ny fil,'a'
för att lägga till en befintlig fil, eller'x'
för att enbart skapa och skriva en ny fil. Om mode är'x'
och file hänvisar till en befintlig fil, kommer ettFileExistsError
att uppstå. Om mode är'a'
och file hänvisar till en befintlig ZIP-fil, läggs ytterligare filer till i den. Om file inte hänvisar till en ZIP-fil läggs ett nytt ZIP-arkiv till i filen. Detta är avsett för att lägga till ett ZIP-arkiv till en annan fil (t.ex.python.exe
). Om mode är'a'
och filen inte finns alls, skapas den. Om mode är'r'
eller'a'
bör filen vara sökbar.compression är den ZIP-komprimeringsmetod som ska användas när arkivet skrivs, och bör vara
ZIP_STORED
,ZIP_DEFLATED
,ZIP_BZIP2
,ZIP_LZMA
, ellerZIP_ZSTANDARD
; okända värden kommer att orsakaNotImplementedError
. OmZIP_DEFLATED
,ZIP_BZIP2
,ZIP_LZMA
, ellerZIP_ZSTANDARD
anges men motsvarande modul (zlib
,bz2
,lzma
, ellercompression.zstd
) inte är tillgänglig, uppstårRuntimeError
. Standardvärdet ärZIP_STORED
.Om allowZip64 är
True
(standard) kommer zipfile att skapa ZIP-filer som använder ZIP64-tillägg när zipfilen är större än 4 GiB. Om det ärfalse
kommerzipfile
att ge upphov till ett undantag när ZIP-filen kräver ZIP64-tillägg.Parametern compresslevel styr vilken komprimeringsnivå som ska användas när filer skrivs till arkivet. Vid användning av
ZIP_STORED
ellerZIP_LZMA
har den ingen effekt. Vid användning avZIP_DEFLATED
accepteras heltalen0
till9
(sezlib
för mer information). När du använderZIP_BZIP2
accepteras heltalen1
till9
(sebz2
för mer information). När du använderZIP_ZSTANDARD
accepteras ofta heltalen-131072
till22
(seCompressionParameter.compression_level
för mer information om hur du hämtar giltiga värden och deras betydelse).Argumentet strict_timestamps, när det är inställt på
False
, gör det möjligt att zippa filer som är äldre än 1980-01-01 på bekostnad av att tidsstämpeln sätts till 1980-01-01. Liknande beteende inträffar med filer som är nyare än 2107-12-31, tidsstämpeln sätts också till gränsen.När mode är
'r'
kan metadata_encoding anges till namnet på en codec, som kommer att användas för att avkoda metadata som namn på medlemmar och ZIP-kommentarer.Om filen skapas med läge
'w'
,'x'
eller'a'
och sedanclosed
utan att några filer läggs till i arkivet, kommer lämpliga ZIP-strukturer för ett tomt arkiv att skrivas till filen.ZipFile är också en kontexthanterare och stöder därför
with
-satsen. I exemplet stängs myzip efter attwith
-satsens svit är klar - även om ett undantag inträffar:med ZipFile('spam.zip', 'w') som myzip: myzip.write('ägg.txt')
Anteckning
metadata_encoding är en instansomfattande inställning för ZipFile. Det är för närvarande inte möjligt att ställa in detta för varje enskild medlem.
Detta attribut är en lösning för äldre implementeringar som producerar arkiv med namn i den aktuella lokala kodningen eller kodsidan (mestadels i Windows). Enligt .ZIP-standarden kan kodningen av metadata specificeras till antingen IBM-kodsida (standard) eller UTF-8 med en flagga i arkivhuvudet. Denna flagga har företräde framför metadata_encoding, som är ett Python-specifikt tillägg.
Ändrad i version 3.2: Lagt till möjligheten att använda
ZipFile
som kontexthanterare.Ändrad i version 3.4: ZIP64-tillägg är aktiverade som standard.
Ändrad i version 3.5: Lagt till stöd för att skriva till osökbara strömmar. Lagt till stöd för läget
'x'
.Ändrad i version 3.6: Tidigare gavs ett vanligt
RuntimeError
ut för okända komprimeringsvärden.Ändrad i version 3.6.2: Parametern file accepterar en path-like object.
Ändrad i version 3.7: Lägg till parametern compresslevel.
Ändrad i version 3.8: Parametern strict_timestamps är endast nyckelord.
Ändrad i version 3.11: Stöd har lagts till för att ange kodning av medlemsnamn för läsning av metadata i zip-filens katalog och filhuvuden.
- ZipFile.close()¶
Stäng arkivfilen. Du måste anropa
close()
innan du avslutar ditt program, annars kommer inte viktiga poster att skrivas.
- ZipFile.getinfo(name)¶
Returnerar ett
ZipInfo
-objekt med information om arkivmedlemmen namn. Anrop avgetinfo()
för ett namn som för närvarande inte finns i arkivet kommer att ge upphov till ettKeyError
.
- ZipFile.infolist()¶
Returnerar en lista som innehåller ett
ZipInfo
-objekt för varje medlem i arkivet. Objekten är i samma ordning som deras poster i den faktiska ZIP-filen på disken om ett befintligt arkiv öppnades.
- ZipFile.namelist()¶
Returnera en lista med arkivmedlemmar efter namn.
- ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)¶
Tillgång till en medlem av arkivet som ett binärt filliknande objekt. name kan vara antingen namnet på en fil i arkivet eller ett
ZipInfo
-objekt. Parametern mode, om den ingår, måste vara'r'
(standard) eller'w'
. pwd är det lösenord som används för att dekryptera krypterade ZIP-filer som ettbytes
-objekt.open()
är också en kontexthanterare och stöder därförwith
statement:med ZipFile('spam.zip') som myzip: med myzip.open('eggs.txt') som myfile: print(myfile.read())
Med mode
'r'
är det filliknande objektet (ZipExtFile
) skrivskyddat och tillhandahåller följande metoder:read()
,readline()
,readlines()
,seek()
,tell()
,__iter__()
,__next__()
. Dessa objekt kan fungera oberoende av ZipFile.Med
mode='w'
returneras ett skrivbart filhandtag som stöder metodenwrite()
. Medan ett skrivbart filhandtag är öppet kommer försök att läsa eller skriva andra filer i ZIP-filen att ge upphov till ettValueError
.I båda fallen har det filliknande objektet också attributen
name
, som motsvarar namnet på en fil i arkivet, ochmode
, som är'rb'
eller'wb'
beroende på inmatningsläget.Om filstorleken inte är känd i förväg men kan överstiga 2 GiB när du skriver en fil, ska du ange
force_zip64=True
för att säkerställa att rubrikformatet kan stödja stora filer. Om filstorleken är känd i förväg, konstruera ettZipInfo
-objekt medfile_size
inställt, och använd det som name-parameter.Anteckning
Metoderna
open()
,read()
ochextract()
kan ta ett filnamn eller ettZipInfo
-objekt. Du kommer att uppskatta detta när du försöker läsa en ZIP-fil som innehåller medlemmar med dubbla namn.Ändrad i version 3.6: Borttaget stöd för
mode='U'
. Användio.TextIOWrapper
för att läsa komprimerade textfiler i universal newlines-läge.Ändrad i version 3.6:
ZipFile.open()
kan nu användas för att skriva filer till arkivet med alternativetmode='w'
.Ändrad i version 3.6: Anrop av
open()
på en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.Ändrad i version 3.13: Lagt till attributen
name
ochmode
för det skrivbara filliknande objektet. Värdet på attributetmode
för det läsbara filliknande objektet ändrades från'r'
till'rb'
.
- ZipFile.extract(member, path=None, pwd=None)¶
Extrahera en medlem från arkivet till den aktuella arbetskatalogen; medlem måste vara dess fullständiga namn eller ett
ZipInfo
-objekt. Dess filinformation extraheras så exakt som möjligt. path anger en annan katalog att extrahera till. member kan vara ett filnamn eller ettZipInfo
-objekt. pwd är lösenordet som används för krypterade filer som ettbytes
-objekt.Returnerar den normaliserade sökvägen som skapats (en katalog eller en ny fil).
Anteckning
Om ett medlemsfilnamn är en absolut sökväg, kommer en enhet/UNC-delningspunkt och inledande (bakre) snedstreck att tas bort, t.ex.:
///foo/bar
blirfoo/bar
på Unix, ochC:\foo\bar
blirfoo\bar
på Windows. Alla".."
-komponenter i ett medlemsfilnamn tas bort, t.ex.:../../foo../../ba..r
blirfoo../ba..r
. I Windows ersätts olagliga tecken (:
,<
,>
,|
,"
,?
och*
) med understreck (_
).Ändrad i version 3.6: Anrop av
extract()
på en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.Ändrad i version 3.6.2: Parametern path accepterar en path-like object.
- ZipFile.extractall(path=None, members=None, pwd=None)¶
Extraherar alla medlemmar från arkivet till den aktuella arbetskatalogen. path anger en annan katalog att extrahera till. members är valfritt och måste vara en delmängd av den lista som returneras av
namelist()
. pwd är lösenordet som används för krypterade filer som ettbytes
-objekt.Varning
Hämta aldrig ut arkiv från otillförlitliga källor utan föregående kontroll. Det är möjligt att filer skapas utanför path, t.ex. medlemmar som har absoluta filnamn som börjar med
"/"
eller filnamn med två punkter"..."
. Denna modul försöker förhindra detta. Seextract()
anmärkning.Ändrad i version 3.6: Anrop av
extractall()
på en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.Ändrad i version 3.6.2: Parametern path accepterar en path-like object.
- ZipFile.printdir()¶
Skriv ut en innehållsförteckning för arkivet till
sys.stdout
.
- ZipFile.setpassword(pwd)¶
Ange pwd (ett
bytes
-objekt) som standardlösenord för att extrahera krypterade filer.
- ZipFile.read(name, pwd=None)¶
Returnerar bytes för filen namn i arkivet. name är namnet på filen i arkivet, eller ett
ZipInfo
-objekt. Arkivet måste vara öppet för läsning eller append. pwd är det lösenord som används för krypterade filer som ettbytes
-objekt och, om det anges, åsidosätter det standardlösenord som anges medsetpassword()
. Anrop avread()
på en ZipFile som använder en annan komprimeringsmetod änZIP_STORED
,ZIP_DEFLATED
,ZIP_BZIP2
,ZIP_LZMA
ellerZIP_ZSTANDARD
kommer att ge upphov tillNotImplementedError
. Ett fel kommer också att uppstå om motsvarande komprimeringsmodul inte är tillgänglig.Ändrad i version 3.6: Anrop av
read()
på en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.
- ZipFile.testzip()¶
Läs alla filer i arkivet och kontrollera deras CRC och filhuvuden. Returnera namnet på den första dåliga filen, annars returneras
None
.Ändrad i version 3.6: Anrop av
testzip()
på en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.
- ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)¶
Skriv filen med namnet filnamn till arkivet och ge det arkivnamnet arcname (som standard är detta samma som filnamn, men utan enhetsbokstav och med inledande sökvägsavgränsare borttagna). Om compress_type anges åsidosätter den värdet som anges för parametern compression i konstruktören för den nya posten. På samma sätt kommer compresslevel att åsidosätta konstruktören om den anges. Arkivet måste vara öppet med läge
'w'
,'x'
eller'a'
.Anteckning
ZIP-filstandarden har historiskt sett inte specificerat någon metadatakodning, men rekommenderade starkt CP437 (den ursprungliga IBM PC-kodningen) för interoperabilitet. De senaste versionerna tillåter användning av UTF-8 (endast). I den här modulen kommer UTF-8 automatiskt att användas för att skriva medlemsnamnen om de innehåller några icke-ASCII-tecken. Det är inte möjligt att skriva medlemsnamn i någon annan kodning än ASCII eller UTF-8.
Anteckning
Arkivnamn ska vara relativa till arkivets rot, dvs. de ska inte börja med en sökvägsseparator.
Anteckning
Om
arcname
(ellerfilename
, omarcname
inte anges) innehåller en null-byte, kommer namnet på filen i arkivet att avkortas vid null-byten.Anteckning
Ett inledande snedstreck i filnamnet kan leda till att arkivet inte går att öppna i vissa zip-program på Windows-system.
Ändrad i version 3.6: Anrop av
write()
på en ZipFile skapad med läge'r'
eller en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.
- ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)¶
Skriv en fil till arkivet. Innehållet är data, som kan vara antingen en
str
eller enbytes
-instans; om det är enstr
kodas den först som UTF-8. zinfo_or_arcname är antingen filnamnet som det kommer att ges i arkivet, eller enZipInfo
-instans. Om det är en instans måste åtminstone filnamn, datum och tid anges. Om det är ett namn sätts datum och tid till aktuellt datum och tid. Arkivet måste öppnas i läge'w'
,'x'
eller'a'
.Om den anges åsidosätter compress_type det värde som anges för parametern compression i konstruktören för den nya posten, eller i zinfo_or_arcname (om det är en instans av
ZipInfo
). På samma sätt kommer compresslevel att åsidosätta konstruktören om den anges.Anteckning
När du skickar en
ZipInfo
-instans som parameter zinfo_or_arcname, kommer den komprimeringsmetod som används att vara den som anges i medlemmen compress_type i den givnaZipInfo
-instansen. Som standard sätter konstruktören förZipInfo
denna medlem tillZIP_STORED
.Ändrad i version 3.2: Argumentet compress_type.
Ändrad i version 3.6: Anrop av
writestr()
på en ZipFile skapad med läge'r'
eller en stängd ZipFile ger upphov till ettValueError
. Tidigare gavs ettRuntimeError
.
- ZipFile.mkdir(zinfo_or_directory, mode=511)¶
Skapa en katalog inuti arkivet. Om zinfo_or_directory är en sträng skapas en katalog i arkivet med det läge som anges i argumentet mode. Om zinfo_or_directory däremot är en instans av
ZipInfo
ignoreras mode-argumentet.Arkivet måste öppnas med läge
'w'
,'x'
eller'a'
.Tillagd i version 3.11.
Följande dataattribut är också tillgängliga:
- ZipFile.filename¶
Namnet på ZIP-filen.
- ZipFile.debug¶
Den nivå av debugutdata som ska användas. Den kan ställas in från
0
(standard, ingen utdata) till3
(mest utdata). Felsökningsinformation skrivs tillsys.stdout
.
Banobjekt¶
- class zipfile.Path(root, at='')¶
Konstruera ett Path-objekt från en
root
zipfil (som kan vara enZipFile
-instans ellerfile
som är lämplig att skicka tillZipFile
-konstruktören).at
anger platsen för denna sökväg i zipfilen, t.ex. ’dir/file.txt’, ’dir/’ eller ’’. Standardvärdet är den tomma strängen, som anger roten.Anteckning
Klassen
Path
kontrollerar inte filnamn inom ZIP-arkivet. Till skillnad från metodernaZipFile.extract()
ochZipFile.extractall()
är det anroparens ansvar att validera eller rensa filnamn för att förhindra sårbarheter vid sökvägsgenomgång (t.ex. filnamn som innehåller ”…” eller absoluta sökvägar). När du hanterar opålitliga arkiv bör du överväga att lösa upp filnamn medos.path.abspath()
och kontrollera målkatalogen medos.path.commonpath()
.
Path-objekt exponerar följande egenskaper hos pathlib.Path
-objekt:
Path-objekt kan korsas med hjälp av operatorn /
eller joinpath
.
- Path.name¶
Den sista vägkomponenten.
- Path.open(mode='r', *, pwd, **)¶
Anropar
ZipFile.open()
på den aktuella sökvägen. Tillåter öppning för läsning eller skrivning, text eller binärt genom lägen som stöds: ’r’, ’w’, ’rb’, ’wb’. Positionella argument och nyckelordsargument skickas vidare tillio.TextIOWrapper
när den öppnas som text och ignoreras annars.pwd
är parameternpwd
tillZipFile.open()
.Ändrad i version 3.9: Lagt till stöd för text- och binärlägen för öppna. Standardläget är nu text.
Ändrad i version 3.11.2: Parametern
encoding
kan anges som ett positionellt argument utan att orsaka ettTypeError
. Precis som det kunde i 3.9. Kod som behöver vara kompatibel med opatchade versioner av 3.10 och 3.11 måste skicka allaio.TextIOWrapper
-argument, inklusiveencoding
, som nyckelord.
- Path.iterdir()¶
Räkna upp underordnade filer till den aktuella katalogen.
- Path.is_dir()¶
Returnerar
True
om det aktuella sammanhanget refererar till en katalog.
- Path.is_file()¶
Returnerar
True
om det aktuella sammanhanget refererar till en fil.
- Path.is_symlink()¶
Returnerar
True
om det aktuella sammanhanget refererar till en symbolisk länk.Tillagd i version 3.12.
Ändrad i version 3.13: Tidigare skulle
is_symlink
ovillkorligen returneraFalse
.
- Path.exists()¶
Returnerar
True
om den aktuella kontexten refererar till en fil eller katalog i zip-filen.
- Path.suffix¶
Den sista punktseparerade delen av den slutliga komponenten, om sådan finns. Detta kallas vanligen filtillägget.
Tillagd i version 3.11: Lagt till egenskapen
Path.suffix
.
- Path.stem¶
Den sista komponenten i sökvägen, utan dess suffix.
Tillagd i version 3.11: Lagt till egenskapen
Path.stem
.
- Path.suffixes¶
En lista över sökvägens suffix, vanligen kallade filtillägg.
Tillagd i version 3.11: Lagt till egenskapen
Path.suffixes
.
- Path.read_text(*, **)¶
Läser den aktuella filen som unicode-text. Positionella argument och nyckelordsargument skickas vidare till
io.TextIOWrapper
(utombuffer
, som är underförstått av sammanhanget).Ändrad i version 3.11.2: Parametern
encoding
kan anges som ett positionellt argument utan att orsaka ettTypeError
. Precis som det kunde i 3.9. Kod som behöver vara kompatibel med opatchade versioner av 3.10 och 3.11 måste skicka allaio.TextIOWrapper
-argument, inklusiveencoding
, som nyckelord.
- Path.read_bytes()¶
Läs den aktuella filen som bytes.
- Path.joinpath(*other)¶
Returnerar ett nytt Path-objekt med alla andra argument sammanfogade. Följande är likvärdiga:
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'
Ändrad i version 3.10: Före 3.10 var
joinpath
odokumenterad och accepterade exakt en parameter.
Projektet zipp tillhandahåller bakåtporter av den senaste funktionaliteten för sökvägsobjekt till äldre Pythons. Använd zipp.Path
i stället för zipfile.Path
för att få tidig tillgång till ändringar.
PyZipFile-objekt¶
Konstruktorn PyZipFile
tar samma parametrar som konstruktorn ZipFile
och ytterligare en parameter, optimize.
- class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)¶
Ändrad i version 3.2: Parametern optimize har lagts till.
Ändrad i version 3.4: ZIP64-tillägg är aktiverade som standard.
Instanser har en metod utöver de som gäller för
ZipFile
-objekt:- writepy(pathname, basename='', filterfunc=None)¶
Sök efter filer
*.py
och lägg till motsvarande fil i arkivet.Om parametern optimize till
PyZipFile
inte angavs eller-1
, är motsvarande fil en*.pyc
-fil, som kompileras vid behov.Om parametern optimize i
PyZipFile
var0
,1
eller2
, läggs endast filer med den optimeringsnivån (secompile()
) till i arkivet, med kompilering vid behov.Om pathname är en fil måste filnamnet sluta med
.py
, och bara filen (motsvarande*.pyc
) läggs till på den översta nivån (ingen sökvägsinformation). Om söknamn är en fil som inte slutar med.py
, kommer ettRuntimeError
att visas. Om det är en katalog, och katalogen inte är en paketkatalog, läggs alla filer*.pyc
till på den översta nivån. Om katalogen är en paketkatalog läggs alla*.pyc
till under paketnamnet som en filsökväg, och om några underkataloger är paketkataloger läggs alla dessa till rekursivt i sorterad ordning.basename är endast avsedd för internt bruk.
filterfunc, om angivet, måste vara en funktion som tar ett enda strängargument. Den kommer att skickas till varje sökväg (inklusive varje enskild fullständig filväg) innan den läggs till i arkivet. Om filterfunc returnerar ett falskt värde kommer sökvägen inte att läggas till, och om det är en katalog kommer dess innehåll att ignoreras. Om våra testfiler till exempel alla finns i kataloger med namnet
test
eller börjar med strängentest_
, kan vi använda en filterfunc för att exkludera dem:>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) ... >>> zf.writepy('myprog', filterfunc=notests)
Metoden
writepy()
skapar arkiv med filnamn som detta:string.pyc # Namn på högsta nivå test/__init__.pyc # Paketkatalog test/testall.pyc # Modul test.testall test/bogus/__init__.pyc # Katalog för underpaket test/bogus/myfile.pyc # Undermodul test.bogus.myfile
Ändrad i version 3.4: Parametern filterfunc har lagts till.
Ändrad i version 3.6.2: Parametern pathname accepterar en path-like object.
Ändrad i version 3.7: Recursion sorterar katalogposter.
ZipInfo-objekt¶
Instanser av klassen ZipInfo
returneras av metoderna getinfo()
och infolist()
från ZipFile
-objekt. Varje objekt lagrar information om en enda medlem av ZIP-arkivet.
Det finns en klassmetod för att skapa en ZipInfo
-instans för en fil i filsystemet:
- classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)¶
Konstruera en
ZipInfo
-instans för en fil i filsystemet, som förberedelse för att lägga till den i en zip-fil.filnamn ska vara sökvägen till en fil eller katalog i filsystemet.
Om arcname anges kommer det att användas som namn i arkivet. Om arcname inte anges kommer namnet att vara detsamma som filename, men med eventuella enhetsbeteckningar och inledande sökvägsavgränsare borttagna.
Argumentet strict_timestamps, när det är inställt på
False
, gör det möjligt att zippa filer som är äldre än 1980-01-01 på bekostnad av att tidsstämpeln sätts till 1980-01-01. Liknande beteende inträffar med filer som är nyare än 2107-12-31, tidsstämpeln sätts också till gränsen.Tillagd i version 3.6.
Ändrad i version 3.6.2: Parametern filename accepterar en path-like object.
Ändrad i version 3.8: Parametern strict_timestamps (endast nyckelord) har lagts till.
Instanser har följande metoder och attribut:
- ZipInfo.is_dir()¶
Returnerar
True
om denna arkivmedlem är en katalog.Detta använder postens namn: kataloger bör alltid sluta med
/
.Tillagd i version 3.6.
- ZipInfo.filename¶
Namnet på filen i arkivet.
- ZipInfo.date_time¶
Tid och datum för den senaste ändringen av arkivmedlemmen. Detta är en tupel med sex värden:
Index
Värde
0
År (>= 1980)
1
Månad (engångsbaserad)
2
Dag i månaden (enbaserad)
3
Timmar (nollbaserad)
4
Minuter (nollbaserad)
5
Sekunder (nollbaserad)
Anteckning
ZIP-filformatet stöder inte tidsstämplar före 1980.
- ZipInfo.compress_type¶
Typ av komprimering för arkivmedlemmen.
- ZipInfo.extra¶
Data för expansionsfält. I PKZIP Application Note finns några kommentarer om den interna strukturen för de data som finns i detta
bytes
-objekt.
- ZipInfo.create_system¶
System som skapade ZIP-arkiv.
- ZipInfo.create_version¶
PKZIP-version som skapade ZIP-arkiv.
- ZipInfo.extract_version¶
PKZIP-version behövs för att extrahera arkivet.
- ZipInfo.reserved¶
Måste vara noll.
- ZipInfo.flag_bits¶
ZIP-flaggbitar.
- ZipInfo.volume¶
Volymnummer för filhuvudet.
- ZipInfo.internal_attr¶
Interna attribut.
- ZipInfo.external_attr¶
Attribut för externa filer.
- ZipInfo.header_offset¶
Byteoffset till filhuvudet.
- ZipInfo.CRC¶
CRC-32 för den okomprimerade filen.
- ZipInfo.compress_size¶
Storleken på de komprimerade data.
- ZipInfo.file_size¶
Storlek på den okomprimerade filen.
Kommandoradsgränssnitt¶
Modulen zipfile
tillhandahåller ett enkelt kommandoradsgränssnitt för att interagera med ZIP-arkiv.
Om du vill skapa ett nytt ZIP-arkiv anger du dess namn efter alternativet -c
och listar sedan filnamnen som ska ingå:
$ python -m zipfile -c monty.zip spam.txt eggs.txt
Att skicka en katalog är också acceptabelt:
$ python -m zipfile -c monty.zip life-of-brian_1979/
Om du vill extrahera ett ZIP-arkiv till den angivna katalogen använder du alternativet -e
:
$ python -m zipfile -e monty.zip mål-dir/
Om du vill ha en lista över filerna i ett ZIP-arkiv använder du alternativet -l
:
$ python -m zipfile -l monty.zip
Alternativ för kommandoraden¶
Fallgropar vid dekompression¶
Extraktionen i zipfile-modulen kan misslyckas på grund av vissa fallgropar som anges nedan.
Från själva filen¶
Dekomprimering kan misslyckas på grund av felaktigt lösenord / CRC-kontrollsumma / ZIP-format eller komprimeringsmetod / dekryptering som inte stöds.
Begränsningar för filsystem¶
Om begränsningarna i olika filsystem överskrids kan det leda till att dekomprimeringen misslyckas. Till exempel tillåtna tecken i katalogposter, filnamnets längd, sökvägsnamnets längd, storleken på en enskild fil och antalet filer etc.
Begränsningar av resurser¶
Bristen på minne eller diskvolym skulle leda till att dekompressionen misslyckas. Till exempel gäller dekompressionsbomber (aka ZIP bomb) för zipfile-bibliotek som kan orsaka diskvolymutmattning.
Avbrott¶
Avbrott under dekomprimeringen, t.ex. genom att trycka på Control-C eller avbryta dekomprimeringsprocessen, kan leda till ofullständig dekomprimering av arkivet.
Standardbeteenden för extraktion¶
Om du inte känner till standardbeteendena för extrahering kan det leda till oväntade dekomprimeringsresultat. Om du t.ex. extraherar samma arkiv två gånger skrivs filer över utan att du behöver fråga.