Ga naar hoofdinhoud

Werken met zipbestanden in Python

In deze tutorial leer je hoe je met zipbestanden in Python werkt met de zipfile-module. zipfile is een ingebouwde Python-module.
Bijgewerkt 2 okt 2026  · 13 min lezen

Verken met AI

ChatGPTClaudePerplexity

Vereisten om met zipbestanden te werken

  • Je moet weten hoe Python met bestanden omgaat om het werken met zipbestanden te begrijpen. Als je dit niet weet, ga dan naar de W3Schools-sectie File Handling om het te leren.
  • OOP-concept in Python
  • Python-concepten zoals conditionals, loops, functies, classes, enz.

Open deze link om alle zipmappen te downloaden die ik in de volgende secties heb gebruikt.

Wat is een zipbestand?

Zip is een archiefformaat dat verliesvrije datacompressie ondersteunt. Een zipbestand is één bestand dat één of meer gecomprimeerde bestanden bevat.

Waarvoor gebruik je zipbestanden?

  • Zipbestanden helpen je om alle gerelateerde bestanden op één plek te zetten.
  • Zipbestanden helpen de gegevensgrootte te verkleinen.
  • Zipbestanden worden vaak sneller overgedragen dan losse bestanden over veel verbindingen.

zipfile-module

Verken alle methoden en classes van de zipfile-module met de dir()-methode. Bekijk de code om alle classes en methoden van de zipfile-module te krijgen.

import zipfile # importing the 'zipfile' module

print(dir(zipfile))
['BZIP2_VERSION', 'BadZipFile', 'BadZipfile', 'DEFAULT_VERSION', 'LZMACompressor', 'LZMADecompressor', 'LZMA_VERSION', 'LargeZipFile', 'MAX_EXTRACT_VERSION', 'PyZipFile', 'ZIP64_LIMIT', 'ZIP64_VERSION', 'ZIP_BZIP2', 'ZIP_DEFLATED', 'ZIP_FILECOUNT_LIMIT', 'ZIP_LZMA', 'ZIP_MAX_COMMENT', 'ZIP_STORED', 'ZipExtFile', 'ZipFile', 'ZipInfo', '_CD64_CREATE_VERSION', '_CD64_DIRECTORY_RECSIZE', '_CD64_DIRECTORY_SIZE', '_CD64_DISK_NUMBER', '_CD64_DISK_NUMBER_START', '_CD64_EXTRACT_VERSION', '_CD64_NUMBER_ENTRIES_THIS_DISK', '_CD64_NUMBER_ENTRIES_TOTAL', '_CD64_OFFSET_START_CENTDIR', '_CD64_SIGNATURE', '_CD_COMMENT_LENGTH', '_CD_COMPRESSED_SIZE', '_CD_COMPRESS_TYPE', '_CD_CRC', '_CD_CREATE_SYSTEM', '_CD_CREATE_VERSION', '_CD_DATE', '_CD_DISK_NUMBER_START', '_CD_EXTERNAL_FILE_ATTRIBUTES', '_CD_EXTRACT_SYSTEM', '_CD_EXTRACT_VERSION', '_CD_EXTRA_FIELD_LENGTH', '_CD_FILENAME_LENGTH', '_CD_FLAG_BITS', '_CD_INTERNAL_FILE_ATTRIBUTES', '_CD_LOCAL_HEADER_OFFSET', '_CD_SIGNATURE', '_CD_TIME', '_CD_UNCOMPRESSED_SIZE', '_ECD_COMMENT', '_ECD_COMMENT_SIZE', '_ECD_DISK_NUMBER', '_ECD_DISK_START', '_ECD_ENTRIES_THIS_DISK', '_ECD_ENTRIES_TOTAL', '_ECD_LOCATION', '_ECD_OFFSET', '_ECD_SIGNATURE', '_ECD_SIZE', '_EndRecData', '_EndRecData64', '_FH_COMPRESSED_SIZE', '_FH_COMPRESSION_METHOD', '_FH_CRC', '_FH_EXTRACT_SYSTEM', '_FH_EXTRACT_VERSION', '_FH_EXTRA_FIELD_LENGTH', '_FH_FILENAME_LENGTH', '_FH_GENERAL_PURPOSE_FLAG_BITS', '_FH_LAST_MOD_DATE', '_FH_LAST_MOD_TIME', '_FH_SIGNATURE', '_FH_UNCOMPRESSED_SIZE', '_SharedFile', '_Tellable', '_ZipDecrypter', '_ZipWriteFile', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_compression', '_check_zipfile', '_get_compressor', '_get_decompressor', 'binascii', 'bz2', 'compressor_names', 'crc32', 'error', 'importlib', 'io', 'is_zipfile', 'lzma', 'main', 'os', 're', 'shutil', 'sizeCentralDir', 'sizeEndCentDir', 'sizeEndCentDir64', 'sizeEndCentDir64Locator', 'sizeFileHeader', 'stat', 'stringCentralDir', 'stringEndArchive', 'stringEndArchive64', 'stringEndArchive64Locator', 'stringFileHeader', 'struct', 'structCentralDir', 'structEndArchive', 'structEndArchive64', 'structEndArchive64Locator', 'structFileHeader', 'sys', 'threading', 'time', 'zlib']

Je hebt een heleboel classes en methoden gezien, toch? Maar je gaat ze niet allemaal leren. Je leert alleen enkele classes en methoden om met zipbestanden te werken.

Laten we enkele nuttige exceptions, classes en methoden kort bespreken.

Exceptions

Een exception is een bericht dat de exacte fout laat zien zoals jij wilt. In Python gebruik je de sleutelwoorden try, except, finally voor foutafhandeling.

Als je niet bekend bent met foutafhandeling, ga dan naar de Python-Error Handling-documentatie om het te leren.

Laten we alle exceptions in de zipfile-module bekijken.

zipfile.BadZipFile

zipfile.BadZipFile is een exception in de zipfile-module. Deze fout wordt opgegooid bij een ongeldig zipbestand. Zie het onderstaande voorbeeld.

## zipfile.BadZipFile
import zipfile

def main():
    try:
        with zipfile.ZipFile('sample_file.zip') as file: # opening the zip file using 'zipfile.ZipFile' class
            print("Ok")
    except zipfile.BadZipFile: # if the zip file has any errors then it prints the error message which you wrote under the 'except' block
        print('Error: Zip file is corrupted')

if __name__ == '__main__': main()

## I used a badfile for the test
Ok

zipfile.LargeZipFile

Stel dat je met een groot zipbestand wilt werken; dan moet je de ZIP64-functionaliteit inschakelen bij het openen van de zip. Als je dat niet doet, wordt LargeZipFile opgegooid. Zie het voorbeeld.

## zipfile.LargeZipFile
## Without enabling 'Zip64'
import zipfile

def main():
    try:
        with zipfile.ZipFile('sample_file.zip') as file:
            print('File size is compatible')
    except zipfile.LargeZipFile: # it raises an 'LargeZipFile' error because you didn't enable the 'Zip64'
        print('Error: File size if too large')

if __name__ == '__main__': main()
File size is compatible
## zipfile.LargeZipFile
## With enabling 'ZIP64'
import zipfile

def main():
    try:
        with zipfile.ZipFile('sample_file.zip', mode = 'r', allowZip64 = True) as file: # here enabling the 'Zip64'
            print('File size is compatible')
    except zipfile.LargeZipFile:
        print('Error: File size if too large') # if the file size is too large to open it prints the error you have written

if __name__ == '__main__': main()
File size is compatible

Kies een zipbestand dat het beste past bij de exception die je wilt behandelen en voer het programma uit. Dan krijg je een duidelijk beeld.

Classes

Eenvoudig gezegd: een class is een verzameling methoden en attributen. Je gebruikt de methoden en attributen van een class waar je maar wilt door instanties van de class te maken.

Laten we enkele classes van de zipfile-module bekijken.

zipfile.ZipFile

De meest gebruikte class om met zipbestanden te werken is de ZipFile-class.

zipfile.ZipFile wordt gebruikt om zipbestanden te schrijven en te lezen. Hij heeft verschillende methoden om zipbestanden te beheren.

Verken nu de methoden van de ZipFile-class met de dir()-functie. Zie de code.

import zipfile

print(dir(zipfile.ZipFile)) # accessing the 'ZipFile' class
['_RealGetContents', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_extract_member', '_fpclose', '_open_to_write', '_sanitize_windows_name', '_windows_illegal_name_trans_table', '_write_end_record', '_writecheck', 'close', 'comment', 'extract', 'extractall', 'fp', 'getinfo', 'infolist', 'namelist', 'open', 'printdir', 'read', 'setpassword', 'testzip', 'write', 'writestr']

Je hebt de zipfile.ZipFile-class al gebruikt om zipbestanden te lezen in eerdere voorbeelden.

zipfile.ZipFile bevat veel methoden zoals extract, open, getinfo, setpassword, enz. om met zipbestanden te werken.

Laten we een paar methoden van de ZipFile-class bekijken.

## zipfile.ZipFile
import zipfile

def main():
    with zipfile.ZipFile('sample_file.zip') as file:

        # ZipFile.infolist() returns a list containing all the members of an archive file
        print(file.infolist())

        # ZipFile.namelist() returns a list containing all the members with names of an archive file
        print(file.namelist())

        # ZipFile.getinfo(path = filepath) returns the information about a member of Zip file.
        # It raises a KeyError if it doesn't contain the mentioned file
        print(file.getinfo(file.namelist()[-1]))

        # ZipFile.open(path = filepath, mode = mode_type, pwd = password) opens the members of an archive file
        # 'pwd' is optional -> if it has password mention otherwise leave it
        text_file = file.open(name = file.namelist()[-1], mode = 'r')

        # 'read()' method of the file prints all the content of the file. You see this method in file handling.
        print(text_file.read())  

        # You must close the file if you don't open a file using 'with' keyword
        # 'close()' method is used to close the file
        text_file.close()

        # ZipFile.extractall(path = filepath, pwd = password) extracts all the files to current directory
        file.extractall()
        # after executing check the directory to see extracted files


if __name__ == '__main__': main()
[<ZipInfo filename='extra_file.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='READ ME.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>]
['extra_file.txt', 'READ ME.txt', 'even_odd.py']
<ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>
b"num = int(input('Enter a Number:- '))\r\nif num % 2 == 0:\r\n\tprint('{} is Even'.fromat(num))\r\nelse:\r\n\tprint('{} is Odd'.fromat(num))"

Als je alle methoden van de ZipFile-class wilt leren, gebruik dan de help()-functie op de methode die je wilt leren.

Of ga naar de officiële documentatie van Python om meer te leren.

zipfile.ZipInfo

De zipfile.ZipInfo-class wordt gebruikt om een element van een zipmap te representeren.

Verken eerst alle objecten van de zipfile.ZipInfo-class met de dir()-methode. Zie de onderstaande code.

## zipfile.ZipInfo
import zipfile

print(dir(zipfile.ZipInfo))
['CRC', 'FileHeader', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_decodeExtra', '_encodeFilenameFlags', '_raw_time', 'comment', 'compress_size', 'compress_type', 'create_system', 'create_version', 'date_time', 'external_attr', 'extra', 'extract_version', 'file_size', 'filename', 'flag_bits', 'from_file', 'header_offset', 'internal_attr', 'is_dir', 'orig_filename', 'reserved', 'volume']

Nu ga je enkele methoden van de zipfile.ZipInfo-class bekijken

## zipfile.ZipInfo
import zipfile

def main():
    with zipfile.ZipFile('sample_file.zip') as file:

        # 'infolist()' is the object of 'ZipFile' class
        # 'infolist()' returns a list containing all the folders and files of the zip -> 'ZipInfo' objects
        # assigning last element of the list to a variable to test all the methods of 'ZipInfo'
        archive = file.infolist()
        read_me_file = archive[-1]

        # 'ZipInfo' methods

        # ZipInfo_object.filename returns the name of the file
        print("Name of the file:- {}".format(read_me_file.filename))

        # ZipInfo_object.file_size returns the size of the file
        print("Size of the file:- {}".format(read_me_file.file_size))

        # ZipInfo_object.is_dir() returns True if it's directory otherwise False
        print("Is directory:- {}".format(read_me_file.is_dir()))

        # ZipInfo_object.date_time() returns the created date & time of file
        print("File created data & time:- {}".format(read_me_file.date_time))

if __name__ == '__main__': main()
Name of the file:- sample_file/READ ME.txt
Size of the file:- 59
Is directory:- False
File created data & time:- (2018, 10, 4, 11, 32, 22)

Ga naar ZipInfo als je meer wilt leren over de objecten van ZipInfo.

Methoden

Methoden zijn een blok code voor specifieke functionaliteit in het programma. Wil je bijvoorbeeld de absolute waarde van een getal vinden, dan kun je de Python-methode abs gebruiken.

Je kunt die overal gebruiken waar je wilt. Laten we enkele methoden van de zipfile-module bekijken.

zipfile.is_zipfile()

De methode is_zipfile(filename) van de zipfile-module geeft True terug als het bestand een geldig zipbestand is, anders False.

Laten we een voorbeeld bekijken.

## zipfile.is_zip(filename)
import zipfile

def main():
    print(zipfile.is_zipfile('sample_file.zip')) # it returns True

if __name__ == '__main__': main()
True

Werken met zipbestanden

In deze sectie leer je hoe je zipbestanden beheert zoals openen, uitpakken, schrijven, enz.

Een zipbestand uitpakken

Pak de bestanden van een zipbestand uit naar de huidige map met de methode extractall.

## extracting zip file
import zipfile

def main():

    # assigning filename to a variable
    file_name = 'sample_file.zip'

    # opening Zip using 'with' keyword in read mode
    with zipfile.ZipFile(file_name, 'r') as file:
        # printing all the information of archive file contents using 'printdir' method
        print(file.printdir())

        # extracting the files using 'extracall' method
        print('Extracting all files...')
        file.extractall()
        print('Done!') # check your directory of zip file to see the extracted files

if __name__ == '__main__': main()
File Name                                             Modified             Size
sample_file/                                   2018-10-04 11:33:22            0
sample_file/even_odd.py                        2018-06-29 23:35:54          129
sample_file/READ ME.txt                        2018-10-04 11:32:22           59
None
Extracting all files...
Done!

Een zip met wachtwoord uitpakken

Om een zip met een wachtwoord uit te pakken, geef je een waarde door aan het positionele argument pwd van de methoden extract(pwd = password) of extractall(pwd = password).

Je moet een wachtwoord doorgeven als bytes. Om een str naar bytes te converteren gebruik je de ingebouwde Python-methode bytes met utf-8-codering.

Laten we een voorbeeld bekijken.

## extracting zip with password
import zipfile

def main():
    file_name = 'pswd_file.zip'
    pswd = 'datacamp'

    with zipfile.ZipFile(file_name) as file:
        # password you pass must be in the bytes you converted 'str' into 'bytes'
        file.extractall(pwd = bytes(pswd, 'utf-8'))

if __name__ == '__main__': main()

Je kunt bestanden ook uitpakken met de methode setpassword(pwd = password) van de ZipFile-class. Zie het onderstaande voorbeeld.

## extracting zip with password
import zipfile

def main():
    file_name = 'pswd_file.zip'
    pswd = 'datacamp'

    with zipfile.ZipFile(file_name) as file:
        # 'setpassword' method is used to give a password to the 'Zip'
        file.setpassword(pwd = bytes(pswd, 'utf-8'))
        file.extractall()

if __name__ == '__main__': main()

Zipbestanden maken

Om een zipbestand te maken heb je geen extra methoden nodig. Geef gewoon de naam door aan de ZipFile-class en er wordt een archief in de huidige map aangemaakt.

Zie het onderstaande voorbeeld.

## Creating Zip file
import zipfile

def main():

    archive_name = 'example_file.zip'
    # below one line of code will create a 'Zip' in the current working directory
    with zipfile.ZipFile(archive_name, 'w') as file:
        print("{} is created.".format(archive_name))

if __name__ == '__main__': main()
example_file.zip is created.

Schrijven naar zipbestanden

Je moet zipbestanden in de schrijfmodus openen om bestanden aan het archief toe te voegen. Dit overschrijft alle bestaande bestanden in de zip.

Laten we een voorbeeld bekijken.

## Writing files to zip
import zipfile

def main():

    file_name = 'sample_file.zip'

    # Opening the 'Zip' in writing mode
    with zipfile.ZipFile(file_name, 'w') as file:
        # write mode overrides all the existing files in the 'Zip.'
        # you have to create the file which you have to write to the 'Zip.'
        file.write('extra_file.txt')
        print('File overrides the existing files')

    # opening the 'Zip' in reading mode to check
    with zipfile.ZipFile(file_name, 'r') as file:
        print(file.namelist())

if __name__ == '__main__': main()
File overrides the existing files
['extra_file.txt']

Bestanden toevoegen aan een zip

Je moet de zip in de append (a)-modus openen om bestanden aan de zip toe te voegen. Het overschrijft de bestaande bestanden niet.

Laten we een voorbeeld bekijken.

## Appending files to zip
import zipfile

def main():

    file_name = 'sample_file.zip'

    # opening the 'Zip' in writing mode
    with zipfile.ZipFile(file_name, 'a') as file:
        # append mode adds files to the 'Zip'
        # you have to create the files which you have to add to the 'Zip'
        file.write('READ ME.txt')
        file.write('even_odd.py')
        print('Files added to the Zip')

    # opening the 'Zip' in reading mode to check
    with zipfile.ZipFile(file_name, 'r') as file:
        print(file.namelist())

if __name__ == '__main__': main()
Files added to the Zip
['extra_file.txt', 'READ ME.txt', 'even_odd.py']

Tot nu toe heb je geleerd hoe je met zipbestanden werkt. Je kunt nu zipbestanden openen, schrijven, toevoegen, uitpakken, maken, enz. Nu ga je een eenvoudig programma schrijven.

Wat gaan we doen?

Meerdere sub-zipbestanden met wachtwoord uitpakken met loops en zipfile

  • Je hebt een zip die in de diepte enkele sub-zipbestanden bevat. En elk van de zipbestanden heeft als wachtwoord zijn eigen naam. Onze uitdaging is om alle zips uit te pakken tot je het einde bereikt.

Stappen om het probleem op te lossen

  • Pak het bovenliggende bestand uit met zijn naam als wachtwoord.
  • Haal de naam van het eerste kind op met de methode namelist(). Sla deze op in een variabele.
  • Voer de loop oneindig uit.

    • Controleer of het bestand een zip is met de methode is_zipfile(). Zo ja, doe dan het volgende.

      • Open de zip met de variabele name.

      • Haal het wachtwoord van de zip uit de variabele name.

      • Pak de zip uit.

      • Haal en sla de volgende zip-naam op in de variabele name.

    • anders

      • Verlaat de loop met break.

Ik heb bovenstaande procedure opgesteld. Als je wilt, kun je die aanpassen aan de structuur van jouw bestanden.

## Solution
import zipfile

def main():

    # storing the parent name
    parent_file_name = '000.zip'

    with zipfile.ZipFile(parent_file_name, 'r') as parent_file:

        # extracting the parent file
        pswd = bytes(parent_file_name.split('.')[0], 'utf-8')
        parent_file.extractall(pwd = pswd)

        # getting the first child
        next_zip_name = parent_file.namelist()[0]

        # looping through the sub zips infinite times until you don't encouter a 'Zip' file
        while True:

            if zipfile.is_zipfile(next_zip_name):
                # opening the zip
                with zipfile.ZipFile(next_zip_name, 'r') as child_file:

                    # getting password from the zip name
                    pswd = bytes(next_zip_name.split('.')[0], 'utf-8')

                    # extracting the zip
                    child_file.extractall(pwd = pswd)

                    # getting the child zip name
                    next_zip_name = child_file.namelist()[0]
            else:
                break

if __name__ == '__main__': main()

Na het uitvoeren van het bovenstaande programma zie je dat alle sub-zips naar de huidige map zijn uitgepakt.

Slotwoord

Gefeliciteerd met het afronden van de tutorial!

Hopelijk vond je de tutorial leuk. Dit artikel helpt je veel wanneer je met zipbestanden werkt. Je kunt nu met zipbestanden overweg.

Als je vragen hebt over het artikel, stel ze dan in de reacties. Ik reageer zo snel mogelijk.

Nogmaals, als je nieuw bent met Python, volg dan DataCamp's gratis cursus Intro to Python for Data Science om de Python-taal te leren of lees de officiële Python-documentatie.

Happy Coding!

Onderwerpen
Python

Python-cursussen

Cursus

Introductie tot Python

4 uur
7.1M
Leer de basis van data-analyse met Python in 4 uur. Deze online cursus laat je kennismaken met de Python-interface en populaire pakketten.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken