Bestanden comprimeren en extraheren in Python

Als u al enige tijd computers gebruikt, zijn er waarschijnlijk bestanden tegengekomen met de .ritssluiting uitbreiding. Het zijn speciale bestanden die de gecomprimeerde inhoud van vele andere bestanden, mappen en submappen kunnen bevatten. Dit maakt ze erg handig voor het overbrengen van bestanden via internet. Wist u dat u Python kunt gebruiken om bestanden te comprimeren of uit te pakken??

In deze zelfstudie leer je hoe je de Zip bestand module in Python, om afzonderlijke of meerdere bestanden tegelijk te extraheren of te comprimeren.

Comprimeren van individuele bestanden

Deze is eenvoudig en vereist heel weinig code. We beginnen met het importeren van de Zip bestand module en open vervolgens het object ZipFile in de schrijfmodus door de tweede parameter op te geven als 'w'. De eerste parameter is het pad naar het bestand zelf. Hier is de code die je nodig hebt:

import zipfile jungle_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ jungle.zip', 'w') jungle_zip.write ('C: \\ Stories \\ Fantasy \\ jungle.pdf', compress_type = zipfile.ZIP_DEFLATED) jungle_zip.close ()

Houd er rekening mee dat ik het pad in alle codefragmenten in een Windows-stijlindeling zal specificeren; je moet de nodige wijzigingen aanbrengen als je Linux of Mac gebruikt.

U kunt verschillende compressiemethoden opgeven om bestanden te comprimeren. De nieuwere methoden BZIP2 en LZMA zijn toegevoegd in Python-versie 3.3 en er zijn ook enkele andere tools die deze twee compressiemethoden niet ondersteunen. Om deze reden is het veilig om alleen de leeggelopen methode. Probeer deze methoden nog steeds uit om het verschil in de grootte van het gecomprimeerde bestand te zien.

Comprimeren van meerdere bestanden

Dit is enigszins complex omdat je alle bestanden moet herhalen. De onderstaande code moet alle bestanden comprimeren met de extensie pdf in een bepaalde map:

import os import zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ archive.zip', 'w') voor map, submappen, bestanden in os.walk ('C: \\ Stories \\ Fantasy '): voor bestand in bestanden: if file.endswith ('. pdf '): fantasy_zip.write (os.path.join (map, bestand), os.path.relpath (os.path.join (map, bestand) , 'C: \\ Stories \\ Fantasy'), compress_type = zipfile.ZIP_DEFLATED) fantasy_zip.close () 

Deze keer hebben we het os module en gebruikte het lopen() methode om alle bestanden en submappen in onze oorspronkelijke map te doorlopen. Ik comprimeer alleen de pdf-bestanden in de map. U kunt ook verschillende gearchiveerde bestanden maken voor elke indeling met als statements.

Als u de mapstructuur niet wilt behouden, kunt u alle bestanden samenvoegen met behulp van de volgende regel:

fantasy_zip.write (os.path.join (map, bestand), bestand, compress_type = zipfile.ZIP_DEFLATED)

De schrijven() methode accepteert drie parameters. De eerste parameter is de naam van ons bestand dat we willen comprimeren. De tweede parameter is optioneel en stelt u in staat om een ​​andere bestandsnaam voor het gecomprimeerde bestand op te geven. Als er niets is opgegeven, wordt de oorspronkelijke naam gebruikt.

Extractie van alle bestanden

U kunt de extractall () methode om alle bestanden en mappen uit een zipbestand te extraheren naar de huidige werkmap. U kunt ook een mapnaam doorgeven aan extractall () om alle bestanden en mappen in een specifieke map uit te pakken. Als de map die u hebt gepasseerd niet bestaat, maakt deze methode er een voor u. Hier is de code die u kunt gebruiken om bestanden uit te pakken:

import zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ archive.zip') fantasy_zip.extractall ('C: \\ Library \\ Stories \\ Fantasy') fantasy_zip.close ()

Als u meerdere bestanden wilt extraheren, moet u de naam opgeven van bestanden die u als een lijst wilt extraheren.

Afzonderlijke bestanden extraheren

Dit lijkt op het extraheren van meerdere bestanden. Een verschil is dat je deze keer eerst de bestandsnaam moet opgeven en het pad om ze later uit te pakken. U moet ook de extract() methode in plaats van extractall (). Hier is een standaard codefragment om afzonderlijke bestanden uit te pakken.

importeer zipfile fantasy_zip = zipfile.ZipFile ('C: \\ Stories \\ Fantasy \\ archive.zip') fantasy_zip.extract ('Fantasy Jungle.pdf', 'C: \\ Stories \\ Fantasy') fantasy_zip.close ( ) 

Zip-bestanden lezen

Overweeg een scenario waarin u moet zien of een zip-archief een specifiek bestand bevat. Tot nu toe is je enige optie om dit te doen door alle bestanden in het archief te extraheren. Het is ook mogelijk dat u alleen die bestanden moet extraheren die groter zijn dan een specifieke grootte. De Zip bestand module stelt ons in staat te informeren naar de inhoud van een archief zonder het ooit te extraheren.

De ... gebruiken namenlijst() De methode van het ZipFile-object retourneert een lijst met alle leden van een archief op naam. Om informatie over een specifiek bestand in het archief te krijgen, kunt u de informatie verkrijgen() methode van het ZipFile-object. Dit geeft u toegang tot specifieke informatie voor dat bestand, zoals de gecomprimeerde en niet-gecomprimeerde grootte van het bestand of de laatste wijzigingstijd. Daar komen we later op terug.

Oproep aan de informatie verkrijgen() methode één voor één op alle bestanden kan een moeizaam proces zijn wanneer er veel bestanden moeten worden verwerkt. In dit geval kunt u de infolist () methode om een ​​lijst met een ZipInfo-object te retourneren voor elk lid in het archief. De volgorde van deze objecten in de lijst is dezelfde als die van echte zipbestanden. 

U kunt ook rechtstreeks de inhoud van een specifiek bestand uit het archief lezen met behulp van de lezen (file) methode, waar het dossier is de naam van het bestand dat u wilt lezen. Om dit te doen, moet het archief worden geopend in de lees- of voegmodus.

Om de gecomprimeerde grootte van een individueel bestand uit het archief te krijgen, kunt u de compress_size attribuut. Evenzo, om de niet-gecomprimeerde grootte te kennen, kunt u de bestandsgrootte attribuut.

De volgende code gebruikt de eigenschappen en methoden die we zojuist hebben besproken om alleen die bestanden te extraheren die een grootte hebben van minder dan 1 MB.

importeer zipfile stories_zip = zipfile.ZipFile ('C: \\ Stories \\ Funny \\ archive.zip') voor bestand in stories_zip.namelist (): if stories_zip.getinfo (bestand) .file_size < 1024*1024: stories_zip.extract(file, 'C:\\Stories\\Short\\Funny') stories_zip.close()

Als u de tijd en datum wilt weten waarop een specifiek bestand uit het archief voor het laatst is gewijzigd, kunt u de datum Tijd attribuut. Dit levert een tuple van zes waarden op. De waarden zijn het jaar, de maand, de dag van de maand, uren, minuten en seconden in die specifieke volgorde. Het jaar is altijd groter dan of gelijk aan 1980 en uren, minuten en seconden zijn gebaseerd op nul. 

import zipfile stories_zip = zipfile.ZipFile ('C: \\ Stories \\ Funny \\ archive.zip') thirsty_crow_info = stories_zip.getinfo ('The Thirsty Crow.pdf') print (thirsty_crow_info.date_time) print (thirsty_crow_info.compress_size) print (thirsty_crow_info.file_size) stories_zip.close ()

Deze informatie over de oorspronkelijke bestandsgrootte en gecomprimeerde bestandsgrootte kan u helpen beslissen of het de moeite waard is om een ​​bestand te comprimeren. Ik weet zeker dat het ook in sommige andere situaties kan worden gebruikt.

Laatste gedachten

Zoals uit deze zelfstudie blijkt, is het gebruik van de Zip bestand module om bestanden te comprimeren geeft je veel flexibiliteit. U kunt verschillende bestanden in een map naar verschillende archieven comprimeren op basis van hun type, naam of grootte. U kunt ook beslissen of u de directorystructuur wilt behouden of niet. Op dezelfde manier kunt u tijdens het uitpakken de bestanden extraheren naar de gewenste locatie, op basis van uw eigen criteria zoals grootte, enz.

Om eerlijk te zijn, het was ook best spannend voor mij om bestanden te comprimeren en uit te pakken door mijn eigen code te schrijven. Ik hoop dat je de tutorial leuk vond en laat het me weten in de comments als je vragen hebt.

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.