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ändiga importlib.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() och infolist() för ZipFile-objekt. De flesta användare av modulen zipfile 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 returneras False. 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-ID 93 för att undvika konflikter, med metod-ID 20 som föråldrat. För kompatibilitet läser modulen zipfile båda metod-ID:n men skriver endast data med metod-ID 93.

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 ett FileExistsError 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, eller ZIP_ZSTANDARD; okända värden kommer att orsaka NotImplementedError. Om ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA, eller ZIP_ZSTANDARD anges men motsvarande modul (zlib, bz2, lzma, eller compression.zstd) inte är tillgänglig, uppstår RuntimeError. Standardvärdet är ZIP_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 är false kommer zipfile 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 eller ZIP_LZMA har den ingen effekt. Vid användning av ZIP_DEFLATED accepteras heltalen 0 till 9 (se zlib för mer information). När du använder ZIP_BZIP2 accepteras heltalen 1 till 9 (se bz2 för mer information). När du använder ZIP_ZSTANDARD accepteras ofta heltalen -131072 till 22 (se CompressionParameter.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 sedan closed 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 att with-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.3: Lagt till stöd för bzip2 och lzma-komprimering.

Ä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 av getinfo() för ett namn som för närvarande inte finns i arkivet kommer att ge upphov till ett KeyError.

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 ett bytes-objekt.

open() är också en kontexthanterare och stöder därför with 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 metoden write(). Medan ett skrivbart filhandtag är öppet kommer försök att läsa eller skriva andra filer i ZIP-filen att ge upphov till ett ValueError.

I båda fallen har det filliknande objektet också attributen name, som motsvarar namnet på en fil i arkivet, och mode, 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 ett ZipInfo-objekt med file_size inställt, och använd det som name-parameter.

Anteckning

Metoderna open(), read() och extract() kan ta ett filnamn eller ett ZipInfo-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änd io.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 alternativet mode='w'.

Ändrad i version 3.6: Anrop av open() på en stängd ZipFile ger upphov till ett ValueError. Tidigare gavs ett RuntimeError.

Ändrad i version 3.13: Lagt till attributen name och mode för det skrivbara filliknande objektet. Värdet på attributet mode 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 ett ZipInfo-objekt. pwd är lösenordet som används för krypterade filer som ett bytes-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 blir foo/bar på Unix, och C:\foo\bar blir foo\bar på Windows. Alla ".."-komponenter i ett medlemsfilnamn tas bort, t.ex.: ../../foo../../ba..r blir foo../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 ett ValueError. Tidigare gavs ett RuntimeError.

Ä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 ett bytes-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. Se extract() anmärkning.

Ändrad i version 3.6: Anrop av extractall() på en stängd ZipFile ger upphov till ett ValueError. Tidigare gavs ett RuntimeError.

Ä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 ett bytes-objekt och, om det anges, åsidosätter det standardlösenord som anges med setpassword(). Anrop av read() på en ZipFile som använder en annan komprimeringsmetod än ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA eller ZIP_ZSTANDARD kommer att ge upphov till NotImplementedError. 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 ett ValueError. Tidigare gavs ett RuntimeError.

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 ett ValueError. Tidigare gavs ett RuntimeError.

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 (eller filename, om arcname 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 ett ValueError. Tidigare gavs ett RuntimeError.

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 en bytes-instans; om det är en str kodas den först som UTF-8. zinfo_or_arcname är antingen filnamnet som det kommer att ges i arkivet, eller en ZipInfo-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 givna ZipInfo-instansen. Som standard sätter konstruktören för ZipInfo denna medlem till ZIP_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 ett ValueError. Tidigare gavs ett RuntimeError.

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) till 3 (mest utdata). Felsökningsinformation skrivs till sys.stdout.

ZipFile.comment

Den kommentar som är associerad med ZIP-filen som ett bytes-objekt. Om du tilldelar en kommentar till en ZipFile-instans som skapats med läge 'w', 'x' eller 'a', bör den inte vara längre än 65535 byte. Kommentarer som är längre än så kommer att trunkeras.

Banobjekt

class zipfile.Path(root, at='')

Konstruera ett Path-objekt från en root zipfil (som kan vara en ZipFile-instans eller file som är lämplig att skicka till ZipFile-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 metoderna ZipFile.extract() och ZipFile.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 med os.path.abspath() och kontrollera målkatalogen med os.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 till io.TextIOWrapper när den öppnas som text och ignoreras annars. pwd är parametern pwd till ZipFile.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 ett TypeError. 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 alla io.TextIOWrapper-argument, inklusive encoding, 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.

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 returnera False.

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 (utom buffer, som är underförstått av sammanhanget).

Ändrad i version 3.11.2: Parametern encoding kan anges som ett positionellt argument utan att orsaka ett TypeError. 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 alla io.TextIOWrapper-argument, inklusive encoding, 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 var 0, 1 eller 2, läggs endast filer med den optimeringsnivån (se compile()) 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 ett RuntimeError 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ängen test_, 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.comment

Kommentar för den enskilda arkivmedlemmen som ett bytes-objekt.

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

-l <zipfile>
--list <zipfile>

Lista filer i en zip-fil.

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

Skapa zip-fil från källfiler.

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

Extrahera zip-filen till målkatalogen.

-t <zipfile>
--test <zipfile>

Testa om zip-filen är giltig eller inte.

--metadata-encoding <encoding>

Ange kodning av medlemsnamn för -l, -e och -t.

Tillagd i version 3.11.

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.